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)