Tree traversal: Difference between revisions
Content added Content deleted
No edit summary |
|||
Line 10,324: | Line 10,324: | ||
} |
} |
||
// |
// From left to right |
||
fn iterative_inorder(&self) -> Vec<&TreeNode<T>> { |
fn iterative_inorder(&self) -> Vec<&TreeNode<T>> { |
||
let mut stack: Vec<&TreeNode<T>> = Vec::new(); |
let mut stack: Vec<&TreeNode<T>> = Vec::new(); |
||
let mut res: Vec<&TreeNode<T>> = Vec::new(); |
let mut res: Vec<&TreeNode<T>> = Vec::new(); |
||
let mut |
let mut option_tree = Some(self); |
||
⚫ | |||
while { |
|||
// Descend leftwards |
|||
while let Some(tree) = option_tree { |
|||
stack.push(tree); |
|||
option_tree = tree.left.as_deref(); |
|||
Some(box ref n) => stack.push(n), |
|||
⚫ | |||
⚫ | |||
match p.left { |
|||
None => break, |
|||
Some(box ref n) => p = n, |
|||
} |
|||
⚫ | |||
// Visit the nodes with no right child |
|||
⚫ | |||
⚫ | |||
res.push(p); |
|||
⚫ | |||
} |
|||
// First node that can potentially have a right child: |
|||
res.push(p); |
|||
if stack.is_empty() { |
|||
break; |
|||
} else { |
|||
p = stack.pop().unwrap(); |
|||
} |
} |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
} |
} |
||
res |
res |