Inorder Traverse without Stack
Question
Suppose each node has the attribute 'parent'.
Solution
The key point is to determining the lastNode we visited. So that we can know the current walking path.
public List<DoubleLinkedTreeNode> inorderWithoutStack(DoubleLinkedTreeNode root) {
DoubleLinkedTreeNode curNode = root, lastNode = null;
List<DoubleLinkedTreeNode> res = new ArrayList<>();
while(curNode != null) {
if(lastNode == curNode.parent) { // go down
if(curNode.left!=null) {
lastNode = curNode;
curNode = curNode.left;
}else if(curNode.right!=null) {
res.add(curNode);
lastNode = curNode;
curNode = curNode.right;
}else {
res.add(curNode);
lastNode = curNode;
curNode = curNode.parent;
}
}else if(lastNode == curNode.left) { // go up
res.add(curNode);
if(curNode.right!=null) {
lastNode = curNode;
curNode = curNode.right;
}else {
lastNode = curNode;
curNode = curNode.parent;
}
}else if(lastNode == curNode.right) { // go up
lastNode = curNode;
curNode = curNode.parent;
}
}
return res;
}
Implement the iterator for inorder. (unchecked)
class InorderIterator implements Iterator<TreeNode> {
Deque<TreeNode> stack;
TreeNode curNode;
public InorderIterator(TreeNode root) {
curNode = root;
stack = new ArrayDeque<>();
}
@Override
public TreeNode next() {
while(curNode!=null) {
stack.push(curNode);
curNode = curNode.left;
}
TreeNode res = curNode;
curNode = stack.pop();
curNode = curNode.right;
return res;
}
@Override
public boolean hasNext() {
return !stack.isEmpty()||curNode!=null;
}
}
Last updated