preorder(node) if node == null then return visit(node) preorder(node.left) preorder(node.right) |
iterativePreorder(node) parentStack = empty stack parentStack.push(null) top = node while ( top != null ) visit( top ) if ( top.right != null ) parentStack.push(top.right) if ( top.left != null ) parentStack.push(top.left) top = parentStack.top(); parentStack.pop(); |
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 |
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 parentStack.pop() visit(peeknode) lastnodevisited = peeknode |
public class Preorder{ /*******************************递归法****************************/ //递归前序遍历 print:10,5,4,7,12 public static void preorder(TNode node){ if(node!=null){ System.out.println(node.getValue()) ; preorder(node.getLeft()) ; preorder(node.getRight()) ; } } //递归中序遍历 print: 4,5,7,10,12 public static void inorder(TNode node){ if(node!=null){ inorder(node.getLeft()) ; System.out.println(node.getValue()) ; inorder(node.getRight()) ; } } //递归后序遍历 print: 4,7,5,12,10 public static void postorder(TNode node){ if(node!=null){ postorder(node.getLeft()) ; postorder(node.getRight()) ; System.out.println(node.getValue()) ; } } /*******************************非递归*****************************/ //非递归前序遍历 print:10,5,4,7,12 public static void iterativePreorder(TNode node){ MyStack parentStack = new MyStack() ; parentStack.push(node) ; while(!parentStack.isEmpty()){ TNode temp = parentStack.getFirst().getValue() ; System.out.println(temp.getValue()) ; parentStack.pop() ; if(temp.getRight()!=null){ parentStack.push(temp.getRight()) ;} if(temp.getLeft()!=null){ parentStack.push(temp.getLeft()) ;} } } //非递归中序遍历 print: 4,5,7,10,12 public static void iterativeInorder(TNode node){ MyStack mystack = new MyStack() ; while(!mystack.isEmpty()||node!=null){ if(node!=null){ mystack.push(node) ; node = node.getLeft() ; }else{ node = mystack.pop().getValue() ; System.out.println(node.getValue()) ; node = node.getRight() ; } } } //非递归后序遍历 print: 4,7,5,12,10 public static void iterativePostorder(TNode node){ MyStack mystack = new MyStack() ; TNode temp = null ; TNode peeknode = null ; while(!mystack.isEmpty()||node!=null){ if(node!=null){ mystack.push(node) ; node = node.getLeft() ; }else{ peeknode = mystack.getFirst().getValue() ; if(peeknode.getRight()!=null&&temp!=peeknode.getRight()){ node = peeknode.getRight() ; }else{ mystack.pop() ; System.out.println(peeknode.getValue()) ; temp = peeknode ; } } } } public static void main(String args[]){ MyTree mytree = new MyTree() ; mytree.insert(10) ; mytree.insert(5); mytree.insert(12); mytree.insert(4); mytree.insert(7); preorder(mytree.getRoot()) ; inorder(mytree.getRoot()) ; postorder(mytree.getRoot()) ; iterativePreorder(mytree.getRoot()) ; iterativeInorder(mytree.getRoot()) ; iterativePostorder(mytree.getRoot()) ; } } /*****************二叉树的实现****************/ class TNode{ private int value ; private TNode left ; private TNode right ; public TNode(int value){ this.value = value ;} public void setLeft(int value){ this.left = new TNode(value) ;} public void setRight(int value){ this.right = new TNode(value) ;} public TNode getLeft(){ return this.left ;} public TNode getRight(){ return this.right ;} public int getValue(){ return this.value ;} } class MyTree{ private TNode root ; public void setRoot(int value){ this.root = new TNode(value) ;} public TNode getRoot(){ return this.root ;} public void insert(int value){ TNode x = this.root ; TNode y = null ; while(x!=null){ y = x ; if(value<x.getValue()){ x = x.getLeft() ;} else{ x = x.getRight() ;} } if(y == null){ setRoot(value) ;} else if(value<y.getValue()) { y.setLeft(value) ;} else{ y.setRight(value) ;} } } /*****************栈的实现****************/ class StackNode{ public TNode item ; public StackNode next ; public StackNode(){ ;} public StackNode(TNode item){ this.item = item ;} public TNode getValue(){ return item ;} } class MyStack{ int N ; //size of myStack StackNode first ; // the top of stack //size of mystack public int size(){ return N ;} //empty or not public boolean isEmpty(){ return N==0 ;} public StackNode getFirst(){ return this.first ;} public void push(TNode item){ if(isEmpty()){ first = new StackNode() ; first.item = item; N++; }else{ StackNode oldfirst = first; first = new StackNode() ; first.item = item; first.next = oldfirst; N++; } } public StackNode pop(){ StackNode top = first ; first = first.next; // delete first node N--; return top ; } }
levelorder(root) q = empty queue q.enqueue(root) while not q.empty do node := q.dequeue() visit(node) if node.left ≠ null then q.enqueue(node.left) if node.right ≠ null then q.enqueue(node.right)
《Thinking In Algorithm》10.树的三种遍历(递归与非递归实现),布布扣,bubuko.com
《Thinking In Algorithm》10.树的三种遍历(递归与非递归实现)
原文:http://blog.csdn.net/speedme/article/details/21659899