annotate lisp/emacs-lisp/avl-tree.el @ 88120:3996a7930718

Merge from emacs--devo--0 Patches applied: * emacs--devo--0 (patch 865) - Update from CVS Revision: emacs@sv.gnu.org/emacs--multi-tty--0--patch-45
author Miles Bader <miles@gnu.org>
date Thu, 30 Aug 2007 02:03:47 +0000
parents 7224e10a56f5
children 17a8beea7b8c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
1 ;;; avl-tree.el --- balanced binary trees, AVL-trees
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
2
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
3 ;; Copyright (C) 1995, 2007 Free Software Foundation, Inc.
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
4
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
5 ;; Author: Per Cederqvist <ceder@lysator.liu.se>
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
6 ;; Inge Wallin <inge@lysator.liu.se>
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
7 ;; Thomas Bellman <bellman@lysator.liu.se>
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
8 ;; Maintainer: FSF
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
9 ;; Created: 10 May 1991
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
10 ;; Keywords: extensions, data structures
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
11
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
12 ;; This file is part of GNU Emacs.
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
13
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
14 ;; GNU Emacs is free software; you can redistribute it and/or modify
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
15 ;; it under the terms of the GNU General Public License as published by
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
16 ;; the Free Software Foundation; either version 3, or (at your option)
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
17 ;; any later version.
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
18
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
19 ;; GNU Emacs is distributed in the hope that it will be useful,
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
22 ;; GNU General Public License for more details.
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
23
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
24 ;; You should have received a copy of the GNU General Public License
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
25 ;; along with GNU Emacs; see the file COPYING. If not, write to the
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
26 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
27 ;; Boston, MA 02110-1301, USA.
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
28
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
29 ;;; Commentary:
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
30
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
31 ;; An AVL tree is a nearly-perfect balanced binary tree. A tree
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
32 ;; consists of two cons cells, the first one holding the tag
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
33 ;; 'AVL-TREE in the car cell, and the second one having the tree
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
34 ;; in the car and the compare function in the cdr cell. The tree has
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
35 ;; a dummy node as its root with the real tree in the left pointer.
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
36 ;;
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
37 ;; Each node of the tree consists of one data element, one left
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
38 ;; sub-tree and one right sub-tree. Each node also has a balance
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
39 ;; count, which is the difference in depth of the left and right
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
40 ;; sub-trees.
82903
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
41 ;;
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
42 ;; The "public" functions (prefixed with "avl-tree") are:
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
43 ;; -create, -p, -compare-function, -empty, -enter, -delete,
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
44 ;; -member, -map, -first, -last, -copy, -flatten, -size, -clear.
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
45
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
46 ;;; Code:
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
47
82901
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
48 ;;; ================================================================
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
49 ;;; Functions and macros handling an AVL tree node.
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
50
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
51 (defmacro avl-tree-node-create (left right data balance)
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
52 ;; Create and return an avl-tree node.
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
53 `(vector ,left ,right ,data ,balance))
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
54
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
55 (defmacro avl-tree-node-left (node)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
56 ;; Return the left pointer of NODE.
82896
f064de4f7268 Reduce nesting: Use modern backquote syntax.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82895
diff changeset
57 `(aref ,node 0))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
58
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
59 (defmacro avl-tree-node-right (node)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
60 ;; Return the right pointer of NODE.
82896
f064de4f7268 Reduce nesting: Use modern backquote syntax.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82895
diff changeset
61 `(aref ,node 1))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
62
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
63 (defmacro avl-tree-node-data (node)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
64 ;; Return the data of NODE.
82896
f064de4f7268 Reduce nesting: Use modern backquote syntax.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82895
diff changeset
65 `(aref ,node 2))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
66
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
67 (defmacro avl-tree-node-set-left (node newleft)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
68 ;; Set the left pointer of NODE to NEWLEFT.
82896
f064de4f7268 Reduce nesting: Use modern backquote syntax.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82895
diff changeset
69 `(aset ,node 0 ,newleft))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
70
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
71 (defmacro avl-tree-node-set-right (node newright)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
72 ;; Set the right pointer of NODE to NEWRIGHT.
82896
f064de4f7268 Reduce nesting: Use modern backquote syntax.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82895
diff changeset
73 `(aset ,node 1 ,newright))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
74
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
75 (defmacro avl-tree-node-set-data (node newdata)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
76 ;; Set the data of NODE to NEWDATA.
82896
f064de4f7268 Reduce nesting: Use modern backquote syntax.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82895
diff changeset
77 `(aset ,node 2 ,newdata))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
78
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
79 (defmacro avl-tree-node-branch (node branch)
82903
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
80 "Get value of a branch of a node.
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
81
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
82 NODE is the node, and BRANCH is the branch.
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
83 0 for left pointer, 1 for right pointer and 2 for the data.\""
82896
f064de4f7268 Reduce nesting: Use modern backquote syntax.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82895
diff changeset
84 `(aref ,node ,branch))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
85
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
86 (defmacro avl-tree-node-set-branch (node branch newval)
82903
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
87 "Set value of a branch of a node.
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
88
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
89 NODE is the node, and BRANCH is the branch.
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
90 0 for left pointer, 1 for the right pointer and 2 for the data.
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
91 NEWVAL is new value of the branch.\""
82896
f064de4f7268 Reduce nesting: Use modern backquote syntax.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82895
diff changeset
92 `(aset ,node ,branch ,newval))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
93
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
94 (defmacro avl-tree-node-balance (node)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
95 ;; Return the balance field of a node.
82896
f064de4f7268 Reduce nesting: Use modern backquote syntax.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82895
diff changeset
96 `(aref ,node 3))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
97
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
98 (defmacro avl-tree-node-set-balance (node newbal)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
99 ;; Set the balance field of a node.
82896
f064de4f7268 Reduce nesting: Use modern backquote syntax.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82895
diff changeset
100 `(aset ,node 3 ,newbal))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
101
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
102
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
103 ;;; ================================================================
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
104 ;;; Internal functions for use in the AVL tree package
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
105
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
106 (defmacro avl-tree-root (tree)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
107 ;; Return the root node for an avl-tree. INTERNAL USE ONLY.
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
108 `(avl-tree-node-left (car (cdr ,tree))))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
109
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
110 (defmacro avl-tree-dummyroot (tree)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
111 ;; Return the dummy node of an avl-tree. INTERNAL USE ONLY.
82896
f064de4f7268 Reduce nesting: Use modern backquote syntax.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82895
diff changeset
112 `(car (cdr ,tree)))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
113
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
114 (defmacro avl-tree-cmpfun (tree)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
115 ;; Return the compare function of AVL tree TREE. INTERNAL USE ONLY.
82896
f064de4f7268 Reduce nesting: Use modern backquote syntax.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82895
diff changeset
116 `(cdr (cdr ,tree)))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
117
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
118 ;; ----------------------------------------------------------------
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
119 ;; Deleting data
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
120
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
121 (defun avl-tree-del-balance1 (node branch)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
122 ;; Rebalance a tree and return t if the height of the tree has shrunk.
82902
c27b2ab395b6 (avl-tree-del-balance1, avl-tree-del-balance2)
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82901
diff changeset
123 (let ((br (avl-tree-node-branch node branch))
c27b2ab395b6 (avl-tree-del-balance1, avl-tree-del-balance2)
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82901
diff changeset
124 p1 b1 p2 b2 result)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
125 (cond
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
126 ((< (avl-tree-node-balance br) 0)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
127 (avl-tree-node-set-balance br 0)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
128 t)
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
129
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
130 ((= (avl-tree-node-balance br) 0)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
131 (avl-tree-node-set-balance br +1)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
132 nil)
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
133
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
134 (t
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
135 ;; Rebalance.
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
136 (setq p1 (avl-tree-node-right br)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
137 b1 (avl-tree-node-balance p1))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
138 (if (>= b1 0)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
139 ;; Single RR rotation.
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
140 (progn
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
141 (avl-tree-node-set-right br (avl-tree-node-left p1))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
142 (avl-tree-node-set-left p1 br)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
143 (if (= 0 b1)
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
144 (progn
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
145 (avl-tree-node-set-balance br +1)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
146 (avl-tree-node-set-balance p1 -1)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
147 (setq result nil))
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
148 (avl-tree-node-set-balance br 0)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
149 (avl-tree-node-set-balance p1 0)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
150 (setq result t))
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
151 (avl-tree-node-set-branch node branch p1)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
152 result)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
153
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
154 ;; Double RL rotation.
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
155 (setq p2 (avl-tree-node-left p1)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
156 b2 (avl-tree-node-balance p2))
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
157 (avl-tree-node-set-left p1 (avl-tree-node-right p2))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
158 (avl-tree-node-set-right p2 p1)
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
159 (avl-tree-node-set-right br (avl-tree-node-left p2))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
160 (avl-tree-node-set-left p2 br)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
161 (if (> b2 0)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
162 (avl-tree-node-set-balance br -1)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
163 (avl-tree-node-set-balance br 0))
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
164 (if (< b2 0)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
165 (avl-tree-node-set-balance p1 +1)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
166 (avl-tree-node-set-balance p1 0))
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
167 (avl-tree-node-set-branch node branch p2)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
168 (avl-tree-node-set-balance p2 0)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
169 t)))))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
170
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
171 (defun avl-tree-del-balance2 (node branch)
82902
c27b2ab395b6 (avl-tree-del-balance1, avl-tree-del-balance2)
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82901
diff changeset
172 (let ((br (avl-tree-node-branch node branch))
c27b2ab395b6 (avl-tree-del-balance1, avl-tree-del-balance2)
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82901
diff changeset
173 p1 b1 p2 b2 result)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
174 (cond
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
175 ((> (avl-tree-node-balance br) 0)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
176 (avl-tree-node-set-balance br 0)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
177 t)
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
178
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
179 ((= (avl-tree-node-balance br) 0)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
180 (avl-tree-node-set-balance br -1)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
181 nil)
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
182
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
183 (t
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
184 ;; Rebalance.
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
185 (setq p1 (avl-tree-node-left br)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
186 b1 (avl-tree-node-balance p1))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
187 (if (<= b1 0)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
188 ;; Single LL rotation.
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
189 (progn
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
190 (avl-tree-node-set-left br (avl-tree-node-right p1))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
191 (avl-tree-node-set-right p1 br)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
192 (if (= 0 b1)
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
193 (progn
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
194 (avl-tree-node-set-balance br -1)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
195 (avl-tree-node-set-balance p1 +1)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
196 (setq result nil))
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
197 (avl-tree-node-set-balance br 0)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
198 (avl-tree-node-set-balance p1 0)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
199 (setq result t))
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
200 (avl-tree-node-set-branch node branch p1)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
201 result)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
202
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
203 ;; Double LR rotation.
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
204 (setq p2 (avl-tree-node-right p1)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
205 b2 (avl-tree-node-balance p2))
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
206 (avl-tree-node-set-right p1 (avl-tree-node-left p2))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
207 (avl-tree-node-set-left p2 p1)
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
208 (avl-tree-node-set-left br (avl-tree-node-right p2))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
209 (avl-tree-node-set-right p2 br)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
210 (if (< b2 0)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
211 (avl-tree-node-set-balance br +1)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
212 (avl-tree-node-set-balance br 0))
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
213 (if (> b2 0)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
214 (avl-tree-node-set-balance p1 -1)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
215 (avl-tree-node-set-balance p1 0))
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
216 (avl-tree-node-set-branch node branch p2)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
217 (avl-tree-node-set-balance p2 0)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
218 t)))))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
219
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
220 (defun avl-tree-do-del-internal (node branch q)
82902
c27b2ab395b6 (avl-tree-del-balance1, avl-tree-del-balance2)
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82901
diff changeset
221 (let ((br (avl-tree-node-branch node branch)))
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
222 (if (avl-tree-node-right br)
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
223 (if (avl-tree-do-del-internal br +1 q)
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
224 (avl-tree-del-balance2 node branch))
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
225 (avl-tree-node-set-data q (avl-tree-node-data br))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
226 (avl-tree-node-set-branch node branch
82901
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
227 (avl-tree-node-left br))
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
228 t)))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
229
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
230 (defun avl-tree-do-delete (cmpfun root branch data)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
231 ;; Return t if the height of the tree has shrunk.
82902
c27b2ab395b6 (avl-tree-del-balance1, avl-tree-del-balance2)
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82901
diff changeset
232 (let ((br (avl-tree-node-branch root branch)))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
233 (cond
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
234 ((null br)
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
235 nil)
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
236
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
237 ((funcall cmpfun data (avl-tree-node-data br))
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
238 (if (avl-tree-do-delete cmpfun br 0 data)
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
239 (avl-tree-del-balance1 root branch)))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
240
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
241 ((funcall cmpfun (avl-tree-node-data br) data)
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
242 (if (avl-tree-do-delete cmpfun br 1 data)
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
243 (avl-tree-del-balance2 root branch)))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
244
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
245 (t
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
246 ;; Found it. Let's delete it.
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
247 (cond
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
248 ((null (avl-tree-node-right br))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
249 (avl-tree-node-set-branch root branch (avl-tree-node-left br))
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
250 t)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
251
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
252 ((null (avl-tree-node-left br))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
253 (avl-tree-node-set-branch root branch (avl-tree-node-right br))
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
254 t)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
255
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
256 (t
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
257 (if (avl-tree-do-del-internal br 0 br)
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
258 (avl-tree-del-balance1 root branch))))))))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
259
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
260 ;; ----------------------------------------------------------------
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
261 ;; Entering data
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
262
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
263 (defun avl-tree-enter-balance1 (node branch)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
264 ;; Rebalance a tree and return t if the height of the tree has grown.
82902
c27b2ab395b6 (avl-tree-del-balance1, avl-tree-del-balance2)
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82901
diff changeset
265 (let ((br (avl-tree-node-branch node branch))
c27b2ab395b6 (avl-tree-del-balance1, avl-tree-del-balance2)
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82901
diff changeset
266 p1 p2 b2 result)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
267 (cond
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
268 ((< (avl-tree-node-balance br) 0)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
269 (avl-tree-node-set-balance br 0)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
270 nil)
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
271
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
272 ((= (avl-tree-node-balance br) 0)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
273 (avl-tree-node-set-balance br +1)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
274 t)
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
275
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
276 (t
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
277 ;; Tree has grown => Rebalance.
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
278 (setq p1 (avl-tree-node-right br))
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
279 (if (> (avl-tree-node-balance p1) 0)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
280 ;; Single RR rotation.
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
281 (progn
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
282 (avl-tree-node-set-right br (avl-tree-node-left p1))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
283 (avl-tree-node-set-left p1 br)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
284 (avl-tree-node-set-balance br 0)
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
285 (avl-tree-node-set-branch node branch p1))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
286
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
287 ;; Double RL rotation.
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
288 (setq p2 (avl-tree-node-left p1)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
289 b2 (avl-tree-node-balance p2))
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
290 (avl-tree-node-set-left p1 (avl-tree-node-right p2))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
291 (avl-tree-node-set-right p2 p1)
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
292 (avl-tree-node-set-right br (avl-tree-node-left p2))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
293 (avl-tree-node-set-left p2 br)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
294 (if (> b2 0)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
295 (avl-tree-node-set-balance br -1)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
296 (avl-tree-node-set-balance br 0))
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
297 (if (< b2 0)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
298 (avl-tree-node-set-balance p1 +1)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
299 (avl-tree-node-set-balance p1 0))
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
300 (avl-tree-node-set-branch node branch p2))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
301 (avl-tree-node-set-balance (avl-tree-node-branch node branch) 0)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
302 nil))))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
303
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
304 (defun avl-tree-enter-balance2 (node branch)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
305 ;; Return t if the tree has grown.
82902
c27b2ab395b6 (avl-tree-del-balance1, avl-tree-del-balance2)
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82901
diff changeset
306 (let ((br (avl-tree-node-branch node branch))
c27b2ab395b6 (avl-tree-del-balance1, avl-tree-del-balance2)
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82901
diff changeset
307 p1 p2 b2)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
308 (cond
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
309 ((> (avl-tree-node-balance br) 0)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
310 (avl-tree-node-set-balance br 0)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
311 nil)
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
312
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
313 ((= (avl-tree-node-balance br) 0)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
314 (avl-tree-node-set-balance br -1)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
315 t)
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
316
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
317 (t
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
318 ;; Balance was -1 => Rebalance.
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
319 (setq p1 (avl-tree-node-left br))
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
320 (if (< (avl-tree-node-balance p1) 0)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
321 ;; Single LL rotation.
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
322 (progn
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
323 (avl-tree-node-set-left br (avl-tree-node-right p1))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
324 (avl-tree-node-set-right p1 br)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
325 (avl-tree-node-set-balance br 0)
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
326 (avl-tree-node-set-branch node branch p1))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
327
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
328 ;; Double LR rotation.
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
329 (setq p2 (avl-tree-node-right p1)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
330 b2 (avl-tree-node-balance p2))
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
331 (avl-tree-node-set-right p1 (avl-tree-node-left p2))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
332 (avl-tree-node-set-left p2 p1)
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
333 (avl-tree-node-set-left br (avl-tree-node-right p2))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
334 (avl-tree-node-set-right p2 br)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
335 (if (< b2 0)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
336 (avl-tree-node-set-balance br +1)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
337 (avl-tree-node-set-balance br 0))
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
338 (if (> b2 0)
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
339 (avl-tree-node-set-balance p1 -1)
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
340 (avl-tree-node-set-balance p1 0))
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
341 (avl-tree-node-set-branch node branch p2))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
342 (avl-tree-node-set-balance (avl-tree-node-branch node branch) 0)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
343 nil))))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
344
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
345 (defun avl-tree-do-enter (cmpfun root branch data)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
346 ;; Return t if height of tree ROOT has grown. INTERNAL USE ONLY.
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
347 (let ((br (avl-tree-node-branch root branch)))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
348 (cond
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
349 ((null br)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
350 ;; Data not in tree, insert it.
82901
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
351 (avl-tree-node-set-branch
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
352 root branch (avl-tree-node-create nil nil data 0))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
353 t)
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
354
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
355 ((funcall cmpfun data (avl-tree-node-data br))
82901
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
356 (and (avl-tree-do-enter cmpfun br 0 data)
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
357 (avl-tree-enter-balance2 root branch)))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
358
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
359 ((funcall cmpfun (avl-tree-node-data br) data)
82901
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
360 (and (avl-tree-do-enter cmpfun br 1 data)
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
361 (avl-tree-enter-balance1 root branch)))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
362
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
363 (t
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
364 (avl-tree-node-set-data br data)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
365 nil))))
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
366
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
367 ;; ----------------------------------------------------------------
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
368
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
369 (defun avl-tree-mapc (map-function root)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
370 ;; Apply MAP-FUNCTION to all nodes in the tree starting with ROOT.
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
371 ;; The function is applied in-order.
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
372 ;;
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
373 ;; Note: MAP-FUNCTION is applied to the node and not to the data itself.
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
374 ;; INTERNAL USE ONLY.
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
375 (let ((node root)
82893
2321b585ebdd Don't require `cl'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82892
diff changeset
376 (stack nil)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
377 (go-left t))
82893
2321b585ebdd Don't require `cl'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82892
diff changeset
378 (push nil stack)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
379 (while node
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
380 (if (and go-left
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
381 (avl-tree-node-left node))
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
382 ;; Do the left subtree first.
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
383 (progn
82893
2321b585ebdd Don't require `cl'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82892
diff changeset
384 (push node stack)
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
385 (setq node (avl-tree-node-left node)))
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
386 ;; Apply the function...
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
387 (funcall map-function node)
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
388 ;; and do the right subtree.
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
389 (if (avl-tree-node-right node)
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
390 (setq node (avl-tree-node-right node)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
391 go-left t)
82893
2321b585ebdd Don't require `cl'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82892
diff changeset
392 (setq node (pop stack)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
393 go-left nil))))))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
394
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
395 (defun avl-tree-do-copy (root)
82903
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
396 ;; Copy the avl tree with ROOT as root.
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
397 ;; Highly recursive. INTERNAL USE ONLY.
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
398 (if (null root)
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
399 nil
82901
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
400 (avl-tree-node-create
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
401 (avl-tree-do-copy (avl-tree-node-left root))
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
402 (avl-tree-do-copy (avl-tree-node-right root))
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
403 (avl-tree-node-data root)
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
404 (avl-tree-node-balance root))))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
405
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
406
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
407 ;;; ================================================================
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
408 ;;; The public functions which operate on AVL trees.
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
409
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
410 (defun avl-tree-create (compare-function)
82903
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
411 "Create a new empty avl tree and return it.
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
412 COMPARE-FUNCTION is a function which takes two arguments, A and B,
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
413 and returns non-nil if A is less than B, and nil otherwise."
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
414 (cons 'AVL-TREE
82898
e26bae3c1724 Do s/elib-avl-node/avl-tree-node/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82897
diff changeset
415 (cons (avl-tree-node-create nil nil nil 0)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
416 compare-function)))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
417
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
418 (defun avl-tree-p (obj)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
419 "Return t if OBJ is an avl tree, nil otherwise."
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
420 (eq (car-safe obj) 'AVL-TREE))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
421
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
422 (defun avl-tree-compare-function (tree)
82903
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
423 "Return the comparison function for the avl tree TREE."
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
424 (avl-tree-cmpfun tree))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
425
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
426 (defun avl-tree-empty (tree)
82903
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
427 "Return t if avl tree TREE is emtpy, otherwise return nil."
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
428 (null (avl-tree-root tree)))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
429
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
430 (defun avl-tree-enter (tree data)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
431 "In the avl tree TREE insert DATA.
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
432 Return DATA."
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
433 (avl-tree-do-enter (avl-tree-cmpfun tree)
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
434 (avl-tree-dummyroot tree)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
435 0
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
436 data)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
437 data)
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
438
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
439 (defun avl-tree-delete (tree data)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
440 "From the avl tree TREE, delete DATA.
82903
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
441 Return the element in TREE which matched DATA,
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
442 nil if no element matched."
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
443 (avl-tree-do-delete (avl-tree-cmpfun tree)
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
444 (avl-tree-dummyroot tree)
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
445 0
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
446 data))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
447
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
448 (defun avl-tree-member (tree data)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
449 "Return the element in the avl tree TREE which matches DATA.
82903
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
450 Matching uses the compare function previously specified in
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
451 `avl-tree-create' when TREE was created.
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
452
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
453 If there is no such element in the tree, the value is nil."
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
454 (let ((node (avl-tree-root tree))
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
455 (compare-function (avl-tree-cmpfun tree))
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
456 found)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
457 (while (and node
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
458 (not found))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
459 (cond
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
460 ((funcall compare-function data (avl-tree-node-data node))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
461 (setq node (avl-tree-node-left node)))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
462 ((funcall compare-function (avl-tree-node-data node) data)
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
463 (setq node (avl-tree-node-right node)))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
464 (t
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
465 (setq found t))))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
466 (if node
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
467 (avl-tree-node-data node)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
468 nil)))
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
469
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
470 (defun avl-tree-map (__map-function__ tree)
82903
7224e10a56f5 Commentary and docstring munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82902
diff changeset
471 "Apply __MAP-FUNCTION__ to all elements in the avl tree TREE."
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
472 (avl-tree-mapc
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
473 (function (lambda (node)
82901
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
474 (avl-tree-node-set-data
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
475 node (funcall __map-function__
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
476 (avl-tree-node-data node)))))
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
477 (avl-tree-root tree)))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
478
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
479 (defun avl-tree-first (tree)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
480 "Return the first element in TREE, or nil if TREE is empty."
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
481 (let ((node (avl-tree-root tree)))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
482 (if node
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
483 (progn
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
484 (while (avl-tree-node-left node)
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
485 (setq node (avl-tree-node-left node)))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
486 (avl-tree-node-data node))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
487 nil)))
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
488
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
489 (defun avl-tree-last (tree)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
490 "Return the last element in TREE, or nil if TREE is empty."
82899
f0fad697d0aa Do s/elib-avl-/avl-tree-/g. Resulting changed macro and function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82898
diff changeset
491 (let ((node (avl-tree-root tree)))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
492 (if node
82891
fb6442527160 Munge comments, whitespace, indentation, hanging parens; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82890
diff changeset
493 (progn
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
494 (while (avl-tree-node-right node)
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
495 (setq node (avl-tree-node-right node)))
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
496 (avl-tree-node-data node))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
497 nil)))
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
498
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
499 (defun avl-tree-copy (tree)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
500 "Return a copy of the avl tree TREE."
82901
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
501 (let ((new-tree (avl-tree-create (avl-tree-cmpfun tree))))
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
502 (avl-tree-node-set-left (avl-tree-dummyroot new-tree)
82901
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
503 (avl-tree-do-copy (avl-tree-root tree)))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
504 new-tree))
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
505
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
506 (defun avl-tree-flatten (tree)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
507 "Return a sorted list containing all elements of TREE."
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
508 (nreverse
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
509 (let ((treelist nil))
82901
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
510 (avl-tree-mapc
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
511 (function (lambda (node)
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
512 (setq treelist (cons (avl-tree-node-data node)
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
513 treelist))))
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
514 (avl-tree-root tree))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
515 treelist)))
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
516
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
517 (defun avl-tree-size (tree)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
518 "Return the number of elements in TREE."
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
519 (let ((treesize 0))
82901
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
520 (avl-tree-mapc
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
521 (function (lambda (data)
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
522 (setq treesize (1+ treesize))
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
523 data))
18391b91e11f Move things around; munge whitespace, indentation; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82900
diff changeset
524 (avl-tree-root tree))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
525 treesize))
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
526
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
527 (defun avl-tree-clear (tree)
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
528 "Clear the avl tree TREE."
82900
0ff5cfe89663 Do s/elib-node-/avl-tree-node-/g. Resulting changed macro names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82899
diff changeset
529 (avl-tree-node-set-left (avl-tree-dummyroot tree) nil))
82890
03c151908dc7 Initial revision, comprising elib-node.el and avltree.el,
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
diff changeset
530
82892
8ce807303185 Move provide form to end; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82891
diff changeset
531 (provide 'avl-tree)
8ce807303185 Move provide form to end; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82891
diff changeset
532
82894
dbd7c4bc480e Add arch tagline
Miles Bader <miles@gnu.org>
parents: 82893
diff changeset
533 ;; arch-tag: 47e26701-43c9-4222-bd79-739eac6357a9
82895
3b4dacb1e48c Do s/avltree/avl-tree/g. Resulting changed function names:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82894
diff changeset
534 ;;; avl-tree.el ends here