//非递归实现后序遍历--------方法1用两个栈(中右左的逆序左右中)
public staticvoidposOrderUnRecur1(Node head){
System.out.print("pos-order: ");if(head != null){
Stack<Node> s1 = new Stack<Node>();
Stack<Node> s2 = new Stack<Node>();
s1.push(head);while(!s1.isEmpty()){
head = s1.pop();
s2.push(head);//不打印,存到栈里,最后打印栈if(head.left != null){//先压左孩子
s1.push(head.left);}if(head.right != null){//再压右孩子
s1.push(head.right);}}while(!s2.isEmpty()){//打印栈2
System.out.print(s2.pop().value +" ");}}
System.out.println();}
方法2:使用一个栈(可以不掌握)
//非递归实现后序遍历--------方法2用一个栈(不用掌握)
public staticvoidposOrderUnRecur2(Node h){
System.out.print("pos-order: ");if(h != null){
Stack<Node> stack = new Stack<Node>();
stack.push(h);
Node c = null;while(!stack.isEmpty()){
c = stack.peek();if(c.left != null && h != c.left && h != c.right){
stack.push(c.left);}elseif(c.right != null && h != c.right){
stack.push(c.right);}else{
System.out.print(stack.pop().value +" ");
h = c;}}}
System.out.println();}
四、测试结果
//定义的节点类型
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data){
this.value = data;}}----------------------------------------------------------------------------------//递归实现的先序中序后序遍历
public staticvoidpreOrderRecur(Node head){if(head == null){return;}
System.out.print(head.value +" ");preOrderRecur(head.left);preOrderRecur(head.right);}
public staticvoidinOrderRecur(Node head){if(head == null){return;}inOrderRecur(head.left);
System.out.print(head.value +" ");inOrderRecur(head.right);}
public staticvoidposOrderRecur(Node head){if(head == null){return;}posOrderRecur(head.left);posOrderRecur(head.right);
System.out.print(head.value +" ");}-------------------------------------------------
public staticvoidmain(String[] args){
Node head = new Node(5);
head.left = new Node(3);
head.right = new Node(8);
head.left.left = new Node(2);
head.left.right = new Node(4);
head.left.left.left = new Node(1);
head.right.left = new Node(7);
head.right.left.left = new Node(6);
head.right.right = new Node(10);
head.right.right.left = new Node(9);
head.right.right.right = new Node(11);// recursive
System.out.println("==============recursive==============");
System.out.print("pre-order: ");preOrderRecur(head);
System.out.println();
System.out.print("in-order: ");inOrderRecur(head);
System.out.println();
System.out.print("pos-order: ");posOrderRecur(head);
System.out.println();// unrecursive
System.out.println("============unrecursive=============");preOrderUnRecur(head);inOrderUnRecur(head);posOrderUnRecur1(head);posOrderUnRecur2(head);}