Skip to content

Instantly share code, notes, and snippets.

@nybble41
Created April 10, 2020 03:12
Show Gist options
  • Save nybble41/6c7735bd833cf7536734de06d5866630 to your computer and use it in GitHub Desktop.
Save nybble41/6c7735bd833cf7536734de06d5866630 to your computer and use it in GitHub Desktop.
In-place destructive AVL tree iteration in Rust
pub struct IntoIter<T> {
current: AVLTree<T>,
}
impl<T> IntoIter<T> {
pub fn new(tree: AVLTree<T>) -> Self {
let mut into_iter = IntoIter { current: Empty };
into_iter.traverse_left(tree);
into_iter
}
fn traverse_left(&mut self, mut tree: AVLTree<T>) {
while let NonEmpty(ref mut node) = tree {
mem::swap(&mut node.left, &mut self.current);
mem::swap(&mut self.current, &mut tree);
}
}
}
impl<T> Iterator for IntoIter<T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
let mut node = match mem::replace(&mut self.current, Empty) {
Empty => return None,
NonEmpty(node) => node,
};
self.current = mem::replace(&mut node.left, Empty);
self.traverse_left(mem::replace(&mut node.right, Empty));
Some(node.value)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment