binary_tree/iterators/
inorder.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use 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) = &current.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>;

    /// Creates a iterator that iterates in INORDER
    /// Basic usage:
    /// ```
    /// let mut a = BinaryTree::new(1);
    /// a.vec_insert([1,2,3]);
    /// for i in a.into_iter() {
    ///     println!("{}", *i);
    /// }
    /// ```
    fn into_iter(self) -> Self::IntoIter {
        InOrderIter::new(self)
    }
}