3 iterative tree tranversal approaches

来源:互联网 发布:sqlserver 2005 64 编辑:程序博客网 时间:2024/05/16 14:37

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)