采用非递归方式遍历二叉树

public class BinaryTreeNonRecursion {

    
    public static void main(String[] args) {
        
        Node root = new Node(1);
        root.left = new Node(2);
        root.right = new Node(3);
        root.left.left = new Node(4);
        root.left.right = new Node(5);
        root.right.left = new Node(6);
        root.right.right = new Node(7);
        root.left.right.left = new Node(8);
        root.left.right.right = new Node(9);
        
        postOrder(root);

    }
    
    
    /**
     * 后序遍历,左子树 -> 右子树   -> 根节点
     * 后序遍历的顺序倒过来就是 根节点-> 右子树 -> 左子树   
     * 在先序遍历的顺序是根节点 -> 左子树 -> 右子树  ,
     * 先序遍历是先压根节点 再压右子树,最后压左子树,把压左子树和右子树的顺序换一下,那打印的顺序就是根节点-> 右子树 -> 左子树,我用一个栈先保存,最后出栈时打印就是后序遍历了
     * 
     */
    public static void postOrder(Node  root) {
        Stack<Node> stack = new Stack<Node>();
        Stack<Node> stackPop = new Stack<Node>();
        stack.push(root);
        while(!stack.isEmpty()) {
            Node node = stack.pop();
            if(node != null) {
                stackPop.push(node);
                if(node.left != null) {
                    stack.push(node.left);
                }
                if(node.right != null) {
                    stack.push(node.right);
                }
            }
        }
        while(!stackPop.isEmpty()) {
            System.out.print(stackPop.pop().value+ " ");
        }
        
    }
    
    
    /**
     * 中序遍历,      左子树 ->  根节点   ->  右子树
     * @param root
     */
    public static void inOrder(Node root) {
        Stack<Node> stack = new Stack<Node>();
        //从根节点开始,根节点的左节点,左节点的左节点依次入栈
        stack.push(root);
        while(root.left != null) {
            stack.push(root.left);
            root= root.left;
        }
        while(!stack.isEmpty()) {
            Node temp = stack.pop();
            if(temp != null) {
                //栈顶元素出栈,打印该元素,
                System.out.print(temp.value + " ");
                //右子树不为空,右节点入栈
                if(temp.right != null) {
                    Node n1 = temp.right;
                    //右节点入栈
                    stack.push(temp.right);
                    //右节点的左节点,左节点的左节点入栈
                    while(n1.left != null) {
                        stack.push(n1.left);
                        n1 = n1.left;
                    }
                }
            }
        }
        
    }
    
    
    /**
     * 先序遍历      根节点   ->  左子树  ->  右子树
     * @param root
     */
    public static void preOrder(Node root) {
        //null可以进入栈里,并且没有限制
        Stack<Node> stack = new Stack<Node>();
        //根节点入栈
        stack.push(root);
        while(!stack.isEmpty()) {
            //栈顶元素出栈,打印该元素,
            Node temp = stack.pop();
            if(temp != null) {
                System.out.print(temp.value +" ");
                //右节点入栈
                if(temp.right != null) {
                    stack.push(temp.right);
                }
                //左节点入栈
                if(temp.left != null) {
                    stack.push(temp.left);    
                }
            }
        }
        
    }
    
    
    
    
    public static class Node {
        Node left;
        Node right;
        int value;

        public Node(int value) {
            this.value = value;
        }

    }
}

 

posted @ 2019-10-11 09:57  踏月而来  阅读(308)  评论(0编辑  收藏  举报