aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/emacs-lisp/avl-tree.el122
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 @@
442COMPARE-FUNCTION is a function which takes two arguments, A and B, 442COMPARE-FUNCTION is a function which takes two arguments, A and B,
443and returns non-nil if A is less than B, and nil otherwise." 443and 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)