/** 二叉树遍历 */publicclassBinTree {protectedBTNode root;publicBinTree(BTNode root) {this.root = root;
}publicBTNode getRoot() {returnroot;
}/** 构造树 */publicstaticBTNode init() {
BTNode a =newBTNode('A');
BTNode b =newBTNode('B',null, a);
BTNode c =newBTNode('C');
BTNode d =newBTNode('D', b, c);
BTNode e =newBTNode('E');
BTNode f =newBTNode('F', e,null);
BTNode g =newBTNode('G',null, f);
BTNode h =newBTNode('H', d, g);returnh;// root}/** 访问节点 */publicstaticvoidvisit(BTNode
p) {
System.out.print(p.getKey() +" ");
}/** 递归实现前序遍历 */protectedstaticvoidpreorder(BTNode
p) {if(p !=null) {
visit(p);
preorder(p.getLeft());
preorder(p.getRight());
}
}/** 递归实现中序遍历 */protectedstaticvoidinorder(BTNode
p) {if(p !=null) {
inorder(p.getLeft());
visit(p);
inorder(p.getRight());
}
}/** 递归实现后序遍历 */protectedstaticvoidpostorder(BTNode
p) {if(p !=null) {
postorder(p.getLeft());
postorder(p.getRight());
visit(p);
}
}/** 非递归实现前序遍历 */protectedstaticvoiditerativePreorder(BTNode
p) {
Stack stack =newStack();if(p !=null) {
stack.push(p);while(!stack.empty()) {
p = stack.pop();
visit(p);if(p.getRight() !=null)
stack.push(p.getRight());if(p.getLeft() !=null)
stack.push(p.getLeft());
}
}
}/** 非递归实现后序遍历 */protectedstaticvoiditerativePostorder(BTNode
p) {
BTNode q = p;
Stack stack =newStack();while(p !=null) {// 左子树入栈for(; p.getLeft() !=null; p = p.getLeft())
stack.push(p);// 当前节点无右子或右子已经输出while(p !=null&& (p.getRight() ==null||
p.getRight() == q)) {
visit(p);
q = p;// 记录上一个已输出节点if(stack.empty())return;
p = stack.pop();
}// 处理右子stack.push(p);
p = p.getRight();
}
}/** 非递归实现中序遍历 */protectedstaticvoiditerativeInorder(BTNode
p) {
Stack stack =newStack();while(p !=null) {while(p !=null) {if(p.getRight() !=null)
stack.push(p.getRight());// 当前节点右子入栈stack.push(p);// 当前节点入栈p = p.getLeft();
}
p = stack.pop();while(!stack.empty() && p.getRight() ==null) {
visit(p);
p = stack.pop();
}
visit(p);if(!stack.empty())
p = stack.pop();elsep =null;
}
}publicstaticvoidmain(String[]
args) {
BinTree tree =newBinTree(init());
System.out.print(" Pre-Order:");
preorder(tree.getRoot());
System.out.println();
System.out.print(" In-Order:");
inorder(tree.getRoot());
System.out.println();
System.out.print("Post-Order:");
postorder(tree.getRoot());
System.out.println();
System.out.print(" Pre-Order:");
iterativePreorder(tree.getRoot());
System.out.println();
System.out.print(" In-Order:");
iterativeInorder(tree.getRoot());
System.out.println();
System.out.print("Post-Order:");
iterativePostorder(tree.getRoot());
System.out.println();
}
}