/**
 * public class TreeNode {
 *   public int key;
 *   public TreeNode left;
 *   public TreeNode right;
 *   public TreeNode(int key) {
 *     this.key = key;
 *   }
 * }
 */
public class Solution {
  //recursive way:
  // public List<Integer> postOrder(TreeNode root) {
  //   // Write your solution here.
  //   List<Integer> result = new ArrayList<>();
  //   postOrderHelper(root, result);
  //   return result;
  // }
  // private void postOrderHelper(TreeNode root, List<Integer> result) {
  //   if (root == null) {
  //     return;
  //   }
  //   postOrderHelper(root.left, result);
  //   postOrderHelper(root.right, result);
  //   result.add(root.key);
  // }

  //iterative way:
  public List<Integer> postOrder(TreeNode root) {
    List<Integer> result = new ArrayList<>();
    if (root == null) {
      return result;
    }
    TreeNode prev = null;
    Deque<TreeNode> stack = new LinkedList<>();
    stack.offerFirst(root);
    while(!stack.isEmpty()) {
      TreeNode cur = stack.peekFirst();
      if (prev == null || cur == prev.left || cur == prev.right) {
        if (cur.left != null) {
          stack.offerFirst(cur.left);
        } else if (cur.right != null) {
          stack.offerFirst(cur.right);
        } else {
          result.add(cur.key);
          stack.pollFirst();
        }
      } else if (prev == cur.left) {
        if (cur.right != null) {
          stack.offerFirst(cur.right);
        } else {
          result.add(cur.key);
          stack.pollFirst();
        }
      } else {
        result.add(cur.key);
        stack.pollFirst();
      }
      prev = cur;
    }
    return result;
  }
}

use a prev to track where the node come from.

3 cases

1: (prev == null || cur == prev.left || cur == prev.right) 意思是要么是根节点,要么是当前节点是之前来的节点的左节点或者有节点。 这种情况要继续先往左走,再往右走, 如果都为空,就可以输出。

2:(prev == cur.left) 之前节点是当前节点的左节点, 意思是从左边回来的。 这种情况, 向右走, 为空就直接输出。

3:(prev == cur.right) 之前节点是当前节点的右节点, 意思是从右边回来的。这种情况,直接输出。

每次循环完改变prev指针,到当前节点。

results matching ""

    No results matching ""