binary_tree/iterators/
inorder.rs1use crate::BinaryTree;
2use std::fmt;
3
4pub struct InOrderIter<'a, T>
5where
6 T: 'a + Clone + Ord + Eq + fmt::Debug,
7{
8 stack: Vec<&'a BinaryTree<T>>,
9}
10
11impl<'a, T> InOrderIter<'a, T>
12where
13 T: 'a + Clone + Ord + Eq + fmt::Debug,
14{
15 fn new(tree: &'a BinaryTree<T>) -> Self {
16 let mut iter = InOrderIter { stack: Vec::new() };
17 iter.push_left(tree);
18 iter
19 }
20
21 fn push_left(&mut self, node: &'a BinaryTree<T>) {
22 let mut current = node;
23 while let Some(left) = ¤t.left {
24 self.stack.push(current);
25 current = left;
26 }
27 self.stack.push(current);
28 }
29}
30
31impl<'a, T> Iterator for InOrderIter<'a, T>
32where
33 T: 'a + Clone + Ord + Eq + fmt::Debug,
34{
35 type Item = &'a T;
36
37 fn next(&mut self) -> Option<Self::Item> {
38 if self.stack.is_empty() {
39 return None;
40 }
41
42 let top = self.stack.pop().unwrap();
43 if let Some(ref right) = &top.right {
44 self.push_left(right);
45 }
46
47 top.elem.as_ref().map(|v| &**v)
48 }
49}
50
51impl<'a, T> IntoIterator for &'a BinaryTree<T>
52where
53 T: 'a + Clone + Ord + Eq + fmt::Debug,
54{
55 type Item = &'a T;
56 type IntoIter = InOrderIter<'a, T>;
57
58 fn into_iter(self) -> Self::IntoIter {
68 InOrderIter::new(self)
69 }
70}