3 (declaim (inline level*))
4 (defun level* (x) (if x (level x) 0))
8 (when (= (level* x) (level node))
9 (setf node (rotate-right node)))
13 (let ((x (right node)))
18 (setf node (rotate-left node))
22 (defun aa-rebalance/insert (tree direction-stack)
24 (loop with new-child = (split (skew (caar direction-stack)))
25 for x in (cdr direction-stack)
27 do (insert-child-for-stack-entry x new-child)
28 (setf new-child (split (skew node)))
29 finally (setf (root tree) new-child))))
31 (defun aa-rebalance/delete (tree node replacement stack)
32 ;; This is what I get for trying to do things without sentinels.
33 (loop initially (when replacement
34 (setf (level replacement) (level node)))
35 for (x . rest) on stack
36 do (let* ((node (car x))
39 (when (let ((level (1- (level node))))
40 (or (< (level* y) level)
41 (< (level* z) level)))
43 (when (> (level* z) (level node))
44 (setf (level z) (level node)))
45 (let ((n (skew node)))
46 (set-root-or-entry-child tree (car rest) n)
48 (setf (right n) (skew (right n))))
50 (when (and m (right m))
51 (setf (right m) (skew (right m)))))
53 (set-root-or-entry-child tree (car rest) n)
55 (setf (right n) (split (right n)))))))))
57 (unless (assoc :aa *binary-tree-info*)
61 #'aa-rebalance/delete)