递归与非递归实现树的遍历(java)

package test;
import java.util.Stack;
public class Sort {
    public static void main(String[] args) {
        Node root9=new Node(9,null,null);
        Node root8=new Node(8,null,null);
        Node root7=new Node(7,null,null);
        Node root6=new Node(6,null,null);
        Node root5=new Node(5,null,null);
        Node root4=new Node(4,root8,root9);
        Node root3=new Node(3,root6,root7);
        Node root2=new Node(2,root4,root5);
        Node root1=new Node(1,root2,root3);
        System.out.println("pre...");
        preOrderTraverse(root1);
        System.out.println();
        preOrderTraverseNoRecursion(root1);
        System.out.println();
        System.out.println("in...");
        inOrderTraverse(root1);
        System.out.println();
        inOrderTraverseNoRecursion(root1);
        System.out.println();
        System.out.println("post...");
        postOrderTraverse(root1);
        System.out.println();
        postOrderTraverseNoRecursion(root1);
        System.out.println();


    }
    static class Node{
        public Node(Integer data,Node left,Node right) {
            this.data=data;
            this.left=left;
            this.right=right;
        }
        public Node() {
            super();
        }
        Integer data;
        Node left;
        Node right;
    }
    static void preOrderTraverse(Node root){
        if(root!=null){
            System.out.print(root.data+" ");
            preOrderTraverse(root.left);
            preOrderTraverse(root.right);
        }
    }
    static void preOrderTraverseNoRecursion(Node root){
        Stack<Node> s=new Stack<Node>();
        Stack<Node> s1=new Stack<Node>();
        Node p,p1;
        s.push(root);
        while(!s.isEmpty()){
            while((p=s.lastElement())!=null){
                System.out.print(p.data+" ");
                s.push(p.left);
            }
            s.pop();
            if(!s.isEmpty()){
                p=s.pop();
                s.push(p.right);
            }
        }
    }
    static void inOrderTraverse(Node root){
        if(root!=null){
            inOrderTraverse(root.left);
            System.out.print(root.data+" ");
            inOrderTraverse(root.right);
        }
    }
    static void inOrderTraverseNoRecursion(Node root){
        Stack<Node> s=new Stack<Node>();
        Stack<Node> s1=new Stack<Node>();
        Node p,p1;
        s.push(root);
        while(!s.isEmpty()){
            while((p=s.lastElement())!=null){
                s.push(p.left);
            }
            s.pop();
            if(!s.isEmpty()){
                p=s.pop();
                System.out.print(p.data+" ");
                s.push(p.right);
            }
        }
    }
    static void postOrderTraverse(Node root){
        if(root!=null){
            postOrderTraverse(root.left);
            postOrderTraverse(root.right);
            System.out.print(root.data+" ");
        }
    }

    static void postOrderTraverseNoRecursion(Node root){
        Stack<Node> s=new Stack<Node>();
        Stack<Node> s1=new Stack<Node>();
        Node p,p1;
        s.push(root);
        while(!s.isEmpty()){
            while((p=s.lastElement())!=null){
                s.push(p.left);
            }
            s.pop();
            while(!s1.isEmpty()&&s1.lastElement()==s.lastElement()){
                s.pop();
                p1=s1.pop();
                System.out.print(p1.data+" ");
            }
            if(!s.isEmpty()){
                p=s.lastElement();
                s1.push(p);
                s.push(p.right);
            }
        }
    }
}
原文地址:https://www.cnblogs.com/wjc920/p/9256180.html