binary_tree/iterators/
inorder.rsuse crate::BinaryTree;
use std::fmt;
pub struct InOrderIter<'a, T>
where
T: 'a + Clone + Ord + Eq + fmt::Debug,
{
stack: Vec<&'a BinaryTree<T>>,
}
impl<'a, T> InOrderIter<'a, T>
where
T: 'a + Clone + Ord + Eq + fmt::Debug,
{
fn new(tree: &'a BinaryTree<T>) -> Self {
let mut iter = InOrderIter { stack: Vec::new() };
iter.push_left(tree);
iter
}
fn push_left(&mut self, node: &'a BinaryTree<T>) {
let mut current = node;
while let Some(left) = ¤t.left {
self.stack.push(current);
current = left;
}
self.stack.push(current);
}
}
impl<'a, T> Iterator for InOrderIter<'a, T>
where
T: 'a + Clone + Ord + Eq + fmt::Debug,
{
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
if self.stack.is_empty() {
return None;
}
let top = self.stack.pop().unwrap();
if let Some(ref right) = &top.right {
self.push_left(right);
}
top.elem.as_ref().map(|v| &**v)
}
}
impl<'a, T> IntoIterator for &'a BinaryTree<T>
where
T: 'a + Clone + Ord + Eq + fmt::Debug,
{
type Item = &'a T;
type IntoIter = InOrderIter<'a, T>;
fn into_iter(self) -> Self::IntoIter {
InOrderIter::new(self)
}
}