3 iterative tree tranversal approaches

Depth-first traversal

 
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 then
      parentStack.push(node)
      visit(node)
      node = node.left
    else
      node = parentStack.pop()
      node = node.right
  
 
 
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 then
      parentStack.push(node)
      node = node.left
    else
      node = parentStack.pop()
      visit(node)
      node = node.right

Postorder

postorder(node)
  if node == null then return
  postorder(node.left)
  postorder(node.right)
  visit(node)
 
iterativePostorder(node)
  if node == null then return
  nodeStack.push(node)
  prevNode = null
  while not nodeStack.isEmpty()
    currNode = nodeStack.peek()
    if prevNode == null or prevNode.left == currNode or prevNode.right == currNode
      if currNode.left != null
        nodeStack.push(currNode.left)
      if currNode.right != null
        nodeStack.push(currNode.right)
    else if currNode.left == prevNode
      if currNode.right != null
        nodeStack.push(currNode.right)
    else
      visit(currNode)
      nodeStack.pop()
    prevNode = currNode
 

Breadth-first traversal:

levelorder(root) 
  q = empty queue
  q.enqueue(root)
  while not q.empty do
    node := q.dequeue()
    visit(node)
    if node.left ≠ null
      q.enqueue(node.left)
    if node.right ≠ null
      q.enqueue(node.right)
posted @ 2013-01-09 13:54  西施豆腐渣  阅读(186)  评论(0编辑  收藏  举报