/**
 * public class TreeNode {
 *   public int key;
 *   public TreeNode left;
 *   public TreeNode right;
 *   public TreeNode(int key) {
 *     this.key = key;
 *   }
 * }
 */
public class Solution {
  //recursion:
  // public List<Integer> preOrder(TreeNode root) {
  //   // Write your solution here.
  //   List<Integer> result = new ArrayList<>();
  //   preOrderHelper(root, result);
  //   return result;
  // }

  // private void preOrderHelper(TreeNode root, List<Integer> result) {
  //   if (root == null) {
  //     return;
  //   }
  //   result.add(root.key);
  //   preOrderHelper(root.left, result);
  //   preOrderHelper(root.right, result);
  // }

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

assumption: 输入的treenode不为空。

approach : 用一个stack 来模拟tree的访问顺序。 terminate一个节点的时候, 判断它的右节点是否为空, 不为空offer进stack,再判断它的左节点是否为空,然后再offer进stack。 while 循环, 直到stack为空为止。

O(n),since the travesal,we need visit every single node。

results matching ""

    No results matching ""