二叉树先序、中序、后序遍历

本文详细介绍了二叉树的遍历方法,包括先序、中序和后序遍历的递归与非递归实现。通过具体代码示例,帮助读者理解不同遍历方式的特点及其应用场景。

【题目】

用递归和非递归方式,分别按照二叉树先序、中序和后序打印所有的节点。我们约定:先序遍历顺序为根、左、右;中序遍历顺序为左、根、右;后序遍历顺序为左、右、根。

【递归实现】


    //递归遍历二叉树
    //先序
    public void preOrderRecur(Node head){
        if(head==null){
            return;
        }
        System.out.println(head.value+" ");
        preOrderRecur(head.left);
        preOrderRecur(head.right);
    }
    //中序
    public void inOrderRecur(Node head){
        if(head==null){
            return;
        }
        inOrderRecur(head.left);
        System.out.println(head.value+" ");
        preOrderRecur(head.right);
    }
    //后序
    public void posOrderRecur(Node head){
        if(head==null){
            return;
        }
        posOrderRecur(head.left);
        posOrderRecur(head.right);
        System.out.println(head.value+" ");
    }

【非递归实现】

    //非递归实现遍历二叉树
    //先序
    public void preOrderUnRecur(Node head){
        if(head==null){
            return;
        }
        //①申请栈,头节点head压入栈
        Stack<Node> stack=new Stack<Node>();
        stack.add(head);//add()是在尾部追加数据,继承自Vector
        //②弹出head,打印该值,然后压入右孩子、左孩子
        while(!stack.isEmpty()){
            head=stack.pop();
            System.out.println(head.value+" ");
            if(head.right!=null){
                stack.push(head.right);//push()是在前边追加数据
            }
            if(head.left!=null){
                stack.push(head.left);
            }       
        }
        //③重复步骤2,直到stack为空
    }

    //中序
    public void inOrderUnRecur(Node head) {
        if (head == null) {
            return;
        }
        // ①申请栈
        Stack<Node> stack = new Stack<Node>();
        while (!stack.isEmpty() || head != null) {
        //②依次压入左边界,不断让head=head.left
            if (head != null) {
                stack.push(head);
                head = head.left;
            } else {
            //③没有左边界了,弹出最上面的节点,打印,并令head=head.right,然后重复②
                head = stack.pop();
                System.out.println(head.value + " ");
                head = head.right;
            }
        }
        //④stack为空且cur为空,结束
    }   

    //后序:两个栈实现
    public void posOrderUnRecur(Node head){
        if(head==null){
            return;
        }
        //1.申请两个栈,将head压入s1
        Stack<Node> s1=new Stack<Node>();
        Stack<Node> s2=new Stack<Node>();
        s1.push(head);
        while(!s1.isEmpty()){
        //2.从s1弹出中节点,压入s2,然后依次压入其左、右孩子到s1
            s1.pop();
            s2.push(head);
            if(head.left!=null){
                s1.push(head.left);
            }
            if(head.right!=null){
                s1.push(head.right);
            }
        }
    //3.弹出的节点都压入s2,重复步骤2,直到s1为空(s1压入顺序:左右,S2压入顺序:中右左)
    //4.从s2依次弹出并打印(S2弹出顺序:左右中)
        while(!s2.isEmpty()){
            System.out.println(s2.pop().value+" ");
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值