diff options
| -rw-r--r-- | lisp/emacs-lisp/avl-tree.el | 122 |
1 files changed, 61 insertions, 61 deletions
diff --git a/lisp/emacs-lisp/avl-tree.el b/lisp/emacs-lisp/avl-tree.el index f5d6abc2226..a86fdc60f57 100644 --- a/lisp/emacs-lisp/avl-tree.el +++ b/lisp/emacs-lisp/avl-tree.el | |||
| @@ -96,15 +96,15 @@ | |||
| 96 | ;;; ================================================================ | 96 | ;;; ================================================================ |
| 97 | ;;; Functions and macros handling an AVL tree node. | 97 | ;;; Functions and macros handling an AVL tree node. |
| 98 | 98 | ||
| 99 | (defmacro elib-avl-node-create (left right data balance) | 99 | (defmacro avl-tree-node-create (left right data balance) |
| 100 | ;; Create and return an avl-tree node. | 100 | ;; Create and return an avl-tree node. |
| 101 | `(vector ,left ,right ,data ,balance)) | 101 | `(vector ,left ,right ,data ,balance)) |
| 102 | 102 | ||
| 103 | (defmacro elib-avl-node-balance (node) | 103 | (defmacro avl-tree-node-balance (node) |
| 104 | ;; Return the balance field of a node. | 104 | ;; Return the balance field of a node. |
| 105 | `(aref ,node 3)) | 105 | `(aref ,node 3)) |
| 106 | 106 | ||
| 107 | (defmacro elib-avl-node-set-balance (node newbal) | 107 | (defmacro avl-tree-node-set-balance (node newbal) |
| 108 | ;; Set the balance field of a node. | 108 | ;; Set the balance field of a node. |
| 109 | `(aset ,node 3 ,newbal)) | 109 | `(aset ,node 3 ,newbal)) |
| 110 | 110 | ||
| @@ -140,18 +140,18 @@ | |||
| 140 | b2 | 140 | b2 |
| 141 | result) | 141 | result) |
| 142 | (cond | 142 | (cond |
| 143 | ((< (elib-avl-node-balance br) 0) | 143 | ((< (avl-tree-node-balance br) 0) |
| 144 | (elib-avl-node-set-balance br 0) | 144 | (avl-tree-node-set-balance br 0) |
| 145 | t) | 145 | t) |
| 146 | 146 | ||
| 147 | ((= (elib-avl-node-balance br) 0) | 147 | ((= (avl-tree-node-balance br) 0) |
| 148 | (elib-avl-node-set-balance br +1) | 148 | (avl-tree-node-set-balance br +1) |
| 149 | nil) | 149 | nil) |
| 150 | 150 | ||
| 151 | (t | 151 | (t |
| 152 | ;; Rebalance. | 152 | ;; Rebalance. |
| 153 | (setq p1 (elib-node-right br) | 153 | (setq p1 (elib-node-right br) |
| 154 | b1 (elib-avl-node-balance p1)) | 154 | b1 (avl-tree-node-balance p1)) |
| 155 | (if (>= b1 0) | 155 | (if (>= b1 0) |
| 156 | ;; Single RR rotation. | 156 | ;; Single RR rotation. |
| 157 | (progn | 157 | (progn |
| @@ -159,30 +159,30 @@ | |||
| 159 | (elib-node-set-left p1 br) | 159 | (elib-node-set-left p1 br) |
| 160 | (if (= 0 b1) | 160 | (if (= 0 b1) |
| 161 | (progn | 161 | (progn |
| 162 | (elib-avl-node-set-balance br +1) | 162 | (avl-tree-node-set-balance br +1) |
| 163 | (elib-avl-node-set-balance p1 -1) | 163 | (avl-tree-node-set-balance p1 -1) |
| 164 | (setq result nil)) | 164 | (setq result nil)) |
| 165 | (elib-avl-node-set-balance br 0) | 165 | (avl-tree-node-set-balance br 0) |
| 166 | (elib-avl-node-set-balance p1 0) | 166 | (avl-tree-node-set-balance p1 0) |
| 167 | (setq result t)) | 167 | (setq result t)) |
| 168 | (elib-node-set-branch node branch p1) | 168 | (elib-node-set-branch node branch p1) |
| 169 | result) | 169 | result) |
| 170 | 170 | ||
| 171 | ;; Double RL rotation. | 171 | ;; Double RL rotation. |
| 172 | (setq p2 (elib-node-left p1) | 172 | (setq p2 (elib-node-left p1) |
| 173 | b2 (elib-avl-node-balance p2)) | 173 | b2 (avl-tree-node-balance p2)) |
| 174 | (elib-node-set-left p1 (elib-node-right p2)) | 174 | (elib-node-set-left p1 (elib-node-right p2)) |
| 175 | (elib-node-set-right p2 p1) | 175 | (elib-node-set-right p2 p1) |
| 176 | (elib-node-set-right br (elib-node-left p2)) | 176 | (elib-node-set-right br (elib-node-left p2)) |
| 177 | (elib-node-set-left p2 br) | 177 | (elib-node-set-left p2 br) |
| 178 | (if (> b2 0) | 178 | (if (> b2 0) |
| 179 | (elib-avl-node-set-balance br -1) | 179 | (avl-tree-node-set-balance br -1) |
| 180 | (elib-avl-node-set-balance br 0)) | 180 | (avl-tree-node-set-balance br 0)) |
| 181 | (if (< b2 0) | 181 | (if (< b2 0) |
| 182 | (elib-avl-node-set-balance p1 +1) | 182 | (avl-tree-node-set-balance p1 +1) |
| 183 | (elib-avl-node-set-balance p1 0)) | 183 | (avl-tree-node-set-balance p1 0)) |
| 184 | (elib-node-set-branch node branch p2) | 184 | (elib-node-set-branch node branch p2) |
| 185 | (elib-avl-node-set-balance p2 0) | 185 | (avl-tree-node-set-balance p2 0) |
| 186 | t))))) | 186 | t))))) |
| 187 | 187 | ||
| 188 | (defun elib-avl-del-balance2 (node branch) | 188 | (defun elib-avl-del-balance2 (node branch) |
| @@ -193,18 +193,18 @@ | |||
| 193 | b2 | 193 | b2 |
| 194 | result) | 194 | result) |
| 195 | (cond | 195 | (cond |
| 196 | ((> (elib-avl-node-balance br) 0) | 196 | ((> (avl-tree-node-balance br) 0) |
| 197 | (elib-avl-node-set-balance br 0) | 197 | (avl-tree-node-set-balance br 0) |
| 198 | t) | 198 | t) |
| 199 | 199 | ||
| 200 | ((= (elib-avl-node-balance br) 0) | 200 | ((= (avl-tree-node-balance br) 0) |
| 201 | (elib-avl-node-set-balance br -1) | 201 | (avl-tree-node-set-balance br -1) |
| 202 | nil) | 202 | nil) |
| 203 | 203 | ||
| 204 | (t | 204 | (t |
| 205 | ;; Rebalance. | 205 | ;; Rebalance. |
| 206 | (setq p1 (elib-node-left br) | 206 | (setq p1 (elib-node-left br) |
| 207 | b1 (elib-avl-node-balance p1)) | 207 | b1 (avl-tree-node-balance p1)) |
| 208 | (if (<= b1 0) | 208 | (if (<= b1 0) |
| 209 | ;; Single LL rotation. | 209 | ;; Single LL rotation. |
| 210 | (progn | 210 | (progn |
| @@ -212,30 +212,30 @@ | |||
| 212 | (elib-node-set-right p1 br) | 212 | (elib-node-set-right p1 br) |
| 213 | (if (= 0 b1) | 213 | (if (= 0 b1) |
| 214 | (progn | 214 | (progn |
| 215 | (elib-avl-node-set-balance br -1) | 215 | (avl-tree-node-set-balance br -1) |
| 216 | (elib-avl-node-set-balance p1 +1) | 216 | (avl-tree-node-set-balance p1 +1) |
| 217 | (setq result nil)) | 217 | (setq result nil)) |
| 218 | (elib-avl-node-set-balance br 0) | 218 | (avl-tree-node-set-balance br 0) |
| 219 | (elib-avl-node-set-balance p1 0) | 219 | (avl-tree-node-set-balance p1 0) |
| 220 | (setq result t)) | 220 | (setq result t)) |
| 221 | (elib-node-set-branch node branch p1) | 221 | (elib-node-set-branch node branch p1) |
| 222 | result) | 222 | result) |
| 223 | 223 | ||
| 224 | ;; Double LR rotation. | 224 | ;; Double LR rotation. |
| 225 | (setq p2 (elib-node-right p1) | 225 | (setq p2 (elib-node-right p1) |
| 226 | b2 (elib-avl-node-balance p2)) | 226 | b2 (avl-tree-node-balance p2)) |
| 227 | (elib-node-set-right p1 (elib-node-left p2)) | 227 | (elib-node-set-right p1 (elib-node-left p2)) |
| 228 | (elib-node-set-left p2 p1) | 228 | (elib-node-set-left p2 p1) |
| 229 | (elib-node-set-left br (elib-node-right p2)) | 229 | (elib-node-set-left br (elib-node-right p2)) |
| 230 | (elib-node-set-right p2 br) | 230 | (elib-node-set-right p2 br) |
| 231 | (if (< b2 0) | 231 | (if (< b2 0) |
| 232 | (elib-avl-node-set-balance br +1) | 232 | (avl-tree-node-set-balance br +1) |
| 233 | (elib-avl-node-set-balance br 0)) | 233 | (avl-tree-node-set-balance br 0)) |
| 234 | (if (> b2 0) | 234 | (if (> b2 0) |
| 235 | (elib-avl-node-set-balance p1 -1) | 235 | (avl-tree-node-set-balance p1 -1) |
| 236 | (elib-avl-node-set-balance p1 0)) | 236 | (avl-tree-node-set-balance p1 0)) |
| 237 | (elib-node-set-branch node branch p2) | 237 | (elib-node-set-branch node branch p2) |
| 238 | (elib-avl-node-set-balance p2 0) | 238 | (avl-tree-node-set-balance p2 0) |
| 239 | t))))) | 239 | t))))) |
| 240 | 240 | ||
| 241 | (defun elib-avl-do-del-internal (node branch q) | 241 | (defun elib-avl-do-del-internal (node branch q) |
| @@ -290,40 +290,40 @@ | |||
| 290 | b2 | 290 | b2 |
| 291 | result) | 291 | result) |
| 292 | (cond | 292 | (cond |
| 293 | ((< (elib-avl-node-balance br) 0) | 293 | ((< (avl-tree-node-balance br) 0) |
| 294 | (elib-avl-node-set-balance br 0) | 294 | (avl-tree-node-set-balance br 0) |
| 295 | nil) | 295 | nil) |
| 296 | 296 | ||
| 297 | ((= (elib-avl-node-balance br) 0) | 297 | ((= (avl-tree-node-balance br) 0) |
| 298 | (elib-avl-node-set-balance br +1) | 298 | (avl-tree-node-set-balance br +1) |
| 299 | t) | 299 | t) |
| 300 | 300 | ||
| 301 | (t | 301 | (t |
| 302 | ;; Tree has grown => Rebalance. | 302 | ;; Tree has grown => Rebalance. |
| 303 | (setq p1 (elib-node-right br)) | 303 | (setq p1 (elib-node-right br)) |
| 304 | (if (> (elib-avl-node-balance p1) 0) | 304 | (if (> (avl-tree-node-balance p1) 0) |
| 305 | ;; Single RR rotation. | 305 | ;; Single RR rotation. |
| 306 | (progn | 306 | (progn |
| 307 | (elib-node-set-right br (elib-node-left p1)) | 307 | (elib-node-set-right br (elib-node-left p1)) |
| 308 | (elib-node-set-left p1 br) | 308 | (elib-node-set-left p1 br) |
| 309 | (elib-avl-node-set-balance br 0) | 309 | (avl-tree-node-set-balance br 0) |
| 310 | (elib-node-set-branch node branch p1)) | 310 | (elib-node-set-branch node branch p1)) |
| 311 | 311 | ||
| 312 | ;; Double RL rotation. | 312 | ;; Double RL rotation. |
| 313 | (setq p2 (elib-node-left p1) | 313 | (setq p2 (elib-node-left p1) |
| 314 | b2 (elib-avl-node-balance p2)) | 314 | b2 (avl-tree-node-balance p2)) |
| 315 | (elib-node-set-left p1 (elib-node-right p2)) | 315 | (elib-node-set-left p1 (elib-node-right p2)) |
| 316 | (elib-node-set-right p2 p1) | 316 | (elib-node-set-right p2 p1) |
| 317 | (elib-node-set-right br (elib-node-left p2)) | 317 | (elib-node-set-right br (elib-node-left p2)) |
| 318 | (elib-node-set-left p2 br) | 318 | (elib-node-set-left p2 br) |
| 319 | (if (> b2 0) | 319 | (if (> b2 0) |
| 320 | (elib-avl-node-set-balance br -1) | 320 | (avl-tree-node-set-balance br -1) |
| 321 | (elib-avl-node-set-balance br 0)) | 321 | (avl-tree-node-set-balance br 0)) |
| 322 | (if (< b2 0) | 322 | (if (< b2 0) |
| 323 | (elib-avl-node-set-balance p1 +1) | 323 | (avl-tree-node-set-balance p1 +1) |
| 324 | (elib-avl-node-set-balance p1 0)) | 324 | (avl-tree-node-set-balance p1 0)) |
| 325 | (elib-node-set-branch node branch p2)) | 325 | (elib-node-set-branch node branch p2)) |
| 326 | (elib-avl-node-set-balance (elib-node-branch node branch) 0) | 326 | (avl-tree-node-set-balance (elib-node-branch node branch) 0) |
| 327 | nil)))) | 327 | nil)))) |
| 328 | 328 | ||
| 329 | (defun elib-avl-enter-balance2 (node branch) | 329 | (defun elib-avl-enter-balance2 (node branch) |
| @@ -333,40 +333,40 @@ | |||
| 333 | p2 | 333 | p2 |
| 334 | b2) | 334 | b2) |
| 335 | (cond | 335 | (cond |
| 336 | ((> (elib-avl-node-balance br) 0) | 336 | ((> (avl-tree-node-balance br) 0) |
| 337 | (elib-avl-node-set-balance br 0) | 337 | (avl-tree-node-set-balance br 0) |
| 338 | nil) | 338 | nil) |
| 339 | 339 | ||
| 340 | ((= (elib-avl-node-balance br) 0) | 340 | ((= (avl-tree-node-balance br) 0) |
| 341 | (elib-avl-node-set-balance br -1) | 341 | (avl-tree-node-set-balance br -1) |
| 342 | t) | 342 | t) |
| 343 | 343 | ||
| 344 | (t | 344 | (t |
| 345 | ;; Balance was -1 => Rebalance. | 345 | ;; Balance was -1 => Rebalance. |
| 346 | (setq p1 (elib-node-left br)) | 346 | (setq p1 (elib-node-left br)) |
| 347 | (if (< (elib-avl-node-balance p1) 0) | 347 | (if (< (avl-tree-node-balance p1) 0) |
| 348 | ;; Single LL rotation. | 348 | ;; Single LL rotation. |
| 349 | (progn | 349 | (progn |
| 350 | (elib-node-set-left br (elib-node-right p1)) | 350 | (elib-node-set-left br (elib-node-right p1)) |
| 351 | (elib-node-set-right p1 br) | 351 | (elib-node-set-right p1 br) |
| 352 | (elib-avl-node-set-balance br 0) | 352 | (avl-tree-node-set-balance br 0) |
| 353 | (elib-node-set-branch node branch p1)) | 353 | (elib-node-set-branch node branch p1)) |
| 354 | 354 | ||
| 355 | ;; Double LR rotation. | 355 | ;; Double LR rotation. |
| 356 | (setq p2 (elib-node-right p1) | 356 | (setq p2 (elib-node-right p1) |
| 357 | b2 (elib-avl-node-balance p2)) | 357 | b2 (avl-tree-node-balance p2)) |
| 358 | (elib-node-set-right p1 (elib-node-left p2)) | 358 | (elib-node-set-right p1 (elib-node-left p2)) |
| 359 | (elib-node-set-left p2 p1) | 359 | (elib-node-set-left p2 p1) |
| 360 | (elib-node-set-left br (elib-node-right p2)) | 360 | (elib-node-set-left br (elib-node-right p2)) |
| 361 | (elib-node-set-right p2 br) | 361 | (elib-node-set-right p2 br) |
| 362 | (if (< b2 0) | 362 | (if (< b2 0) |
| 363 | (elib-avl-node-set-balance br +1) | 363 | (avl-tree-node-set-balance br +1) |
| 364 | (elib-avl-node-set-balance br 0)) | 364 | (avl-tree-node-set-balance br 0)) |
| 365 | (if (> b2 0) | 365 | (if (> b2 0) |
| 366 | (elib-avl-node-set-balance p1 -1) | 366 | (avl-tree-node-set-balance p1 -1) |
| 367 | (elib-avl-node-set-balance p1 0)) | 367 | (avl-tree-node-set-balance p1 0)) |
| 368 | (elib-node-set-branch node branch p2)) | 368 | (elib-node-set-branch node branch p2)) |
| 369 | (elib-avl-node-set-balance (elib-node-branch node branch) 0) | 369 | (avl-tree-node-set-balance (elib-node-branch node branch) 0) |
| 370 | nil)))) | 370 | nil)))) |
| 371 | 371 | ||
| 372 | (defun elib-avl-do-enter (cmpfun root branch data) | 372 | (defun elib-avl-do-enter (cmpfun root branch data) |
| @@ -376,7 +376,7 @@ | |||
| 376 | ((null br) | 376 | ((null br) |
| 377 | ;; Data not in tree, insert it. | 377 | ;; Data not in tree, insert it. |
| 378 | (elib-node-set-branch root branch | 378 | (elib-node-set-branch root branch |
| 379 | (elib-avl-node-create nil nil data 0)) | 379 | (avl-tree-node-create nil nil data 0)) |
| 380 | t) | 380 | t) |
| 381 | 381 | ||
| 382 | ((funcall cmpfun data (elib-node-data br)) | 382 | ((funcall cmpfun data (elib-node-data br)) |
| @@ -428,10 +428,10 @@ | |||
| 428 | ;; Highly recursive. INTERNAL USE ONLY. | 428 | ;; Highly recursive. INTERNAL USE ONLY. |
| 429 | (if (null root) | 429 | (if (null root) |
| 430 | nil | 430 | nil |
| 431 | (elib-avl-node-create (elib-avl-do-copy (elib-node-left root)) | 431 | (avl-tree-node-create (elib-avl-do-copy (elib-node-left root)) |
| 432 | (elib-avl-do-copy (elib-node-right root)) | 432 | (elib-avl-do-copy (elib-node-right root)) |
| 433 | (elib-node-data root) | 433 | (elib-node-data root) |
| 434 | (elib-avl-node-balance root)))) | 434 | (avl-tree-node-balance root)))) |
| 435 | 435 | ||
| 436 | 436 | ||
| 437 | ;;; ================================================================ | 437 | ;;; ================================================================ |
| @@ -442,7 +442,7 @@ | |||
| 442 | COMPARE-FUNCTION is a function which takes two arguments, A and B, | 442 | COMPARE-FUNCTION is a function which takes two arguments, A and B, |
| 443 | and returns non-nil if A is less than B, and nil otherwise." | 443 | and returns non-nil if A is less than B, and nil otherwise." |
| 444 | (cons 'AVL-TREE | 444 | (cons 'AVL-TREE |
| 445 | (cons (elib-avl-node-create nil nil nil 0) | 445 | (cons (avl-tree-node-create nil nil nil 0) |
| 446 | compare-function))) | 446 | compare-function))) |
| 447 | 447 | ||
| 448 | (defun avl-tree-p (obj) | 448 | (defun avl-tree-p (obj) |