Skip to main content

platform_trees/trees/
recursive_size_balanced_tree.rs

1use crate::LinkType;
2
3/// Base trait for a size-balanced binary search tree (SBT).
4///
5/// Provides node accessors, tree rotations (`left_rotate`, `right_rotate`),
6/// navigation (`get_leftest`, `get_rightest`, `get_next`, `get_previous`),
7/// and queries (`contains`).
8///
9/// Implementors supply the storage-level operations (the first 12 methods);
10/// all other methods have default implementations built on those primitives.
11///
12/// For iterative `attach`/`detach`, see
13/// [`IterativeSizeBalancedTree`](super::IterativeSizeBalancedTree).
14///
15/// # Safety
16///
17/// All methods are `unsafe` because they operate on raw node indices
18/// without bounds checking — the caller must ensure that every index
19/// passed to these methods refers to a valid, allocated node.
20pub trait RecursiveSizeBalancedTree<T: LinkType> {
21    /// Returns a mutable raw pointer to the left-child field of `node`.
22    unsafe fn get_mut_left_reference(&mut self, node: T) -> *mut T;
23
24    /// Returns a mutable raw pointer to the right-child field of `node`.
25    unsafe fn get_mut_right_reference(&mut self, node: T) -> *mut T;
26
27    /// Returns a const raw pointer to the left-child field of `node`.
28    unsafe fn get_left_reference(&self, node: T) -> *const T;
29
30    /// Returns a const raw pointer to the right-child field of `node`.
31    unsafe fn get_right_reference(&self, node: T) -> *const T;
32
33    /// Returns the left child of `node`.
34    unsafe fn get_left(&self, node: T) -> T;
35
36    /// Returns the right child of `node`.
37    unsafe fn get_right(&self, node: T) -> T;
38
39    /// Returns the subtree size stored at `node`.
40    unsafe fn get_size(&self, node: T) -> T;
41
42    /// Sets the left child of `node`.
43    unsafe fn set_left(&mut self, node: T, left: T);
44
45    /// Sets the right child of `node`.
46    unsafe fn set_right(&mut self, node: T, right: T);
47
48    /// Sets the subtree size of `node`.
49    unsafe fn set_size(&mut self, node: T, size: T);
50
51    /// Returns `true` if `first` should be placed to the left of `second`.
52    unsafe fn first_is_to_the_left_of_second(&self, first: T, second: T) -> bool;
53
54    /// Returns `true` if `first` should be placed to the right of `second`.
55    unsafe fn first_is_to_the_right_of_second(&self, first: T, second: T) -> bool;
56
57    /// Returns the left child of `node`, or `T::funty(0)` if `node` is zero.
58    unsafe fn get_left_or_default(&self, node: T) -> T {
59        unsafe {
60            if node == T::funty(0) {
61                T::funty(0)
62            } else {
63                self.get_left(node)
64            }
65        }
66    }
67
68    /// Returns the right child of `node`, or `T::funty(0)` if `node` is zero.
69    unsafe fn get_right_or_default(&self, node: T) -> T {
70        unsafe {
71            if node == T::funty(0) {
72                T::funty(0)
73            } else {
74                self.get_right(node)
75            }
76        }
77    }
78
79    /// Returns the size of `node`, or zero if `node` is zero.
80    unsafe fn get_size_or_zero(&self, node: T) -> T {
81        unsafe {
82            if node == T::funty(0) {
83                T::funty(0)
84            } else {
85                self.get_size(node)
86            }
87        }
88    }
89
90    /// Increments the subtree size of `node` by one.
91    unsafe fn inc_size(&mut self, node: T) {
92        unsafe {
93            self.set_size(node, self.get_size(node) + T::funty(1));
94        }
95    }
96
97    /// Decrements the subtree size of `node` by one.
98    unsafe fn dec_size(&mut self, node: T) {
99        unsafe {
100            self.set_size(node, self.get_size(node) - T::funty(1));
101        }
102    }
103
104    /// Returns the size of the left subtree of `node`.
105    unsafe fn get_left_size(&self, node: T) -> T {
106        unsafe { self.get_size_or_zero(self.get_left_or_default(node)) }
107    }
108
109    /// Returns the size of the right subtree of `node`.
110    unsafe fn get_right_size(&self, node: T) -> T {
111        unsafe { self.get_size_or_zero(self.get_right_or_default(node)) }
112    }
113
114    /// Recalculates the size of `node` from its children:
115    /// `size = left_size + right_size + 1`.
116    unsafe fn fix_size(&mut self, node: T) {
117        unsafe {
118            self.set_size(
119                node,
120                (self.get_left_size(node) + self.get_right_size(node)) + T::funty(1),
121            );
122        }
123    }
124
125    /// Performs a left rotation at the subtree rooted at `*root`,
126    /// updating `*root` in place.
127    unsafe fn left_rotate(&mut self, root: *mut T) {
128        unsafe {
129            *root = self.left_rotate_core(*root);
130        }
131    }
132
133    /// Performs a left rotation and returns the new root.
134    unsafe fn left_rotate_core(&mut self, root: T) -> T {
135        unsafe {
136            let right = self.get_right(root);
137            self.set_right(root, self.get_left(right));
138            self.set_left(right, root);
139            self.set_size(right, self.get_size(root));
140            self.fix_size(root);
141            right
142        }
143    }
144
145    /// Performs a right rotation at the subtree rooted at `*root`,
146    /// updating `*root` in place.
147    unsafe fn right_rotate(&mut self, root: *mut T) {
148        unsafe {
149            *root = self.right_rotate_core(*root);
150        }
151    }
152
153    /// Performs a right rotation and returns the new root.
154    unsafe fn right_rotate_core(&mut self, root: T) -> T {
155        unsafe {
156            let left = self.get_left(root);
157            self.set_left(root, self.get_right(left));
158            self.set_right(left, root);
159            self.set_size(left, self.get_size(root));
160            self.fix_size(root);
161            left
162        }
163    }
164
165    /// Returns the rightmost (maximum) node in the subtree rooted at `current`.
166    unsafe fn get_rightest(&self, mut current: T) -> T {
167        unsafe {
168            let mut current_right = self.get_right(current);
169            while current_right != T::funty(0) {
170                current = current_right;
171                current_right = self.get_right(current);
172            }
173            current
174        }
175    }
176
177    /// Returns the leftmost (minimum) node in the subtree rooted at `current`.
178    unsafe fn get_leftest(&self, mut current: T) -> T {
179        unsafe {
180            let mut current_left = self.get_left(current);
181            while current_left != T::funty(0) {
182                current = current_left;
183                current_left = self.get_left(current);
184            }
185            current
186        }
187    }
188
189    /// Returns the in-order successor of `node`.
190    unsafe fn get_next(&self, node: T) -> T {
191        unsafe { self.get_leftest(self.get_right(node)) }
192    }
193
194    /// Returns the in-order predecessor of `node`.
195    unsafe fn get_previous(&self, node: T) -> T {
196        unsafe { self.get_rightest(self.get_left(node)) }
197    }
198
199    /// Returns `true` if `node` exists in the tree rooted at `root`.
200    unsafe fn contains(&self, node: T, mut root: T) -> bool {
201        unsafe {
202            while root != T::funty(0) {
203                if self.first_is_to_the_left_of_second(node, root) {
204                    root = self.get_left(root);
205                } else if self.first_is_to_the_right_of_second(node, root) {
206                    root = self.get_right(root);
207                } else {
208                    return true;
209                }
210            }
211            false
212        }
213    }
214
215    /// Resets `node`'s left, right, and size fields to zero.
216    unsafe fn clear_node(&mut self, node: T) {
217        unsafe {
218            self.set_left(node, T::funty(0));
219            self.set_right(node, T::funty(0));
220            self.set_size(node, T::funty(0));
221        }
222    }
223}