Traversal problems are not that easy when recursion is not allowed.
Given a tree:
1
/ \
2 3
/ \ / \
4 5 6 7
using a Stack to save traversed nodes.
1 -> 2 -> 4 -> pop (4) -> 2 -> 5 -> pop (5) -> 2 -> pop (2) -> 1 -> 3 -> 6 -> pop (6) -> 3 -> 7 -> pop (7) -> 3 -> pop (3) -> 1 -> pop(1)
public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class PostOrder { public ArrayListpostorderTraversal(TreeNode root) { ArrayList rst = new ArrayList (); if (root == null) return rst; Stack stack = new Stack (); TreeNode prev = null; TreeNode curr = root; stack.push(root); while (!stack.empty()) { curr = stack.peek(); //Traverse down the tree: prev == null, root; left child; right child if (prev == null || prev.left == curr || prev.right == curr) { if (curr.left != null) stack.push(curr.left); else if (curr.right != null) //Traverse one branch a time stack.push(curr.right); } // Going up else if (curr.left == prev) { //Traverse the right branch if (curr.right != null) stack.add(curr.right); } else { rst.add(curr.val); stack.pop(); } prev = curr; } return rst; } }
No comments:
Post a Comment