二叉树的前、中、后序遍历的Java实现

这篇博客详细介绍了二叉树的三种遍历方法:前序遍历(根左右)、中序遍历(左根右)和后序遍历(左右根)。通过递归实现,分别展示了带if判断和不带if判断的两种实现方式,强调了递归出口的设置。同时,对于每种遍历,都提供了相应的代码实现,帮助读者理解遍历过程。

概述

1.前序遍历; (根左右)
先访问根结点,然后再访问左子树,最后访问右子树
2.中序遍历; (左根右) ★★★
先访问左子树,中间访问根节点,最后访问右子树
3.后序遍历; (左右根)
先访问左子树,再访问右子树,最后访问根节点
在这里插入图片描述

前序遍历

思路 :使用队列来装键key; 前序遍历顺序为(根左右),所以先将当前结点添加至队列que中,然后再先左后右的顺序递归添加key;
若有if判断子树是否存在则不需要return递归出口,若没有if判断是否存在子树则有递归出口 即当前结点为null。
方法一:

    //获取整个树中所有的键key
   public Queue<Key> preErgodic(){  //返回一个队列Queue,(尾插头取)
       Queue<Key> que=new LinkedList();
       preErgodic(root,que);//从root开始获取key
       return que;
   }
    //将当前树的所有key并放到que队列中
    private void preErgodic(Node x,Queue<Key> que){
        if(x==null){ //此时这里是安全校验,并非递归出口 !
            return;
        }

        //先把当前结点x的key先放入队列que中,即前序遍历(根左右)
        que.add(x.key);
        //先递归x结点的左子树
        if(x.left!=null){
            preErgodic(x.left,que);
        }
        //后递归x结点的右子树
        if(x.right!=null){
            preErgodic(x.right,que);
        }
    }

这里if(x==null){ return; } 只是安全校验,只要root不为null,并没有生效。

方法二:
以上亦或者可以改为:

    //前序遍历
    public Queue<Key> preErgodic(){  //返回一个队列Queue,(尾插头取)
        Queue<Key> que=new LinkedList();
        preErgodic(root,que);//从root开始获取key
        return que;
    }
    //将当前树的所有key并放到que队列中
    private void preErgodic(Node x,Queue<Key> que){
        if(x==null){ //当前树为null,递归结束条件 !
              return;
            }

        //先把当前结点x的key先放入队列que中,即前序遍历(根左右)
        que.add(x.key);
        
        //先递归x结点的左子树
            preErgodic(x.left,que);

        //后递归x结点的右子树
            preErgodic(x.right,que);

    }

即去掉i左右子树的if判断,将if(x==null){ return;作为递归出口!

中序遍历

与前序遍历类似:使用队列来装键key; 中序遍历顺序为(左根右),
若有if判断子树是否存在则不需要return递归出口,(方法一)。
若没有if判断是否存在子树则有递归出口 即当前结点为null。(方法二)

public Queue<Key> midErgodic(){
        Queue que=new LinkedList();  //创建队列
        midErgodic(root, que);
        return que;
    }

    private void midErgodic(Node x,Queue que) {
        if (x == null) {
           return;  }//安全性校验

            if (x.left != null) {  //
                midErgodic(x.left, que); //递归
            }

            que.add(x.key);

            if (x.right != null) {
                midErgodic(x.right, que);
            }
        }

后续遍历

原理同上(方法二)

    //后序遍历
    public Queue<Key> afterErgodic(){
        Queue<Key> que =new LinkedList<>();
        afterErgodic(root,que);
        return que;
    }

    private void afterErgodic(Node x, Queue<Key> que) {
        if(x==null){  //递归出口
            return ;
        }
        afterErgodic(x.left,que);
        afterErgodic(x.right,que);
        que.add(x.key);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值