Mercurial > emacs
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 |
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 | 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 | 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 | 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 | 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 | 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 |