LeetCode - Binary Tree Traversal

Pre-order
preorder(node)
  if node == null then return
  visit(node)
  preorder(node.left) 
  preorder(node.right)
iterativePreorder(node)
  parentStack = empty stack
  while (not parentStack.isEmpty() or node ≠ null)
    if (node ≠ null) 
      visit(node)
      if(node.right ≠ null) parentStack.push(node.right) 
      node = node.left   
    else     
      node = parentStack.pop()
In-order
inorder(node)
  if node == null then return
  inorder(node.left)
  visit(node)
  inorder(node.right)
iterativeInorder(node)
  parentStack = empty stack
  while (not parentStack.isEmpty() or node ≠ null)
    if (node ≠ null)
      parentStack.push(node)
      node = node.left
    else
      node = parentStack.pop()
      visit(node)
      node = node.right
Post-order
postorder(node)
  if node == null then return
  postorder(node.left)
  postorder(node.right)
  visit(node)
iterativePostorder(node)
  parentStack = empty stack  
  lastnodevisited = null 
  while (not parentStack.isEmpty() or node ≠ null)
    if (node ≠ null)
      parentStack.push(node)
      node = node.left
    else
      peeknode = parentStack.peek()
      if (peeknode.right ≠ null and 
          lastnodevisited ≠ peeknode.right) 
        /* if right child exists AND traversing node 
         from left child, move right */
        node = peeknode.right
      else
        visit(peeknode)
        lastnodevisited = parentStack.pop() 

 

Pre-order:

public List<Integer> preorderTraversal(TreeNode node) {
    List<Integer> list = new LinkedList<Integer>();
    Stack<TreeNode> stack = new Stack<TreeNode>();
    while(!stack.isEmpty() || node != null) {
        if(node != null) {
            list.add(node.val);
            if(node.right != null) stack.push(node.right);
            node = node.left;
        } else {
            node = stack.pop();
        }
    }
    return list;
}

 

In-order:

private List<Integer> inorderIterative(TreeNode node) {
    List<Integer> list = new ArrayList<Integer>();
    Stack<TreeNode> stack = new Stack<TreeNode>();
    while(!stack.isEmpty() || node != null) {
        if(node != null) {
            stack.push(node);
            node = node.left;
        } else {
            TreeNode p = stack.pop();
            list.add(p.val);
            node = p.right;
        }
    }
    return list;
}

 

Posr-order:

private List<Integer> postorderIterative(TreeNode node) {
    List<Integer> list = new ArrayList<Integer>();
    Stack<TreeNode> stack = new Stack<TreeNode>();
    TreeNode last = null;
    while(!stack.empty() || node != null) {
        if(node != null) {
            stack.push(node);
            node = node.left;
        } else {
            TreeNode p = stack.peek();
            if(p.right != null && p.right != last) {
                node = p.right;
            } else {
                list.add(p.val);
                last = stack.pop();
            }
        }
    }
    return list;
}

 

Reference:

http://en.wikipedia.org/wiki/Tree_traversal#Implementations

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值