算法通关村——二叉树层次遍历原来如此简单

二叉树基本层次遍历

层次遍历又叫做广度优先遍历。

最基础的层次遍历

层次遍历就是从根节点开始访问,然后向下逐层访问,访问完一层后,接着访问下一层,知道没有结点为止。

这里主要的问题就是  当访问一个结点的时候,它的孩子结点该如何保存呢?

这里我们可以用队列来完美解决,队列FIFO,层次遍历同样如此,刚好可以将下一层的结点保存到该层的后面,出队的时候也是该层的结点先出来,其次是下层结点出来。所以这里我们可以用队列解决。 

如上图,

我们可以先3入队,

然后3出队,将3的左右孩子9、20入队;

然后9、20出队,9的左右孩子8、13,20的左右孩子15、17入队

最后8 13 15 17出队,由于没有孩子了,队列也就为空,层次遍历也就结束了

public static List<Integer> simpleLevelOrder(TreeNode root) {
        if (root == null) {
            return new ArrayList<Integer>();
        }
        //res用于存放结点
        List<Integer> res = new ArrayList<Integer>();
        //缓冲队列
        LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
        //将根节点放入队列中,然后不断遍历队列
        queue.add(root);
        //有多少元素执行多少次
        while (queue.size() > 0) {
            //获取当前队列的长度,这个长度相当于 当前这一层的节点个数
            //每次要有出队,不然循环结束不了
            TreeNode t = queue.remove();
            //出队后保存到res中
            res.add(t.val);
            //有孩子就放入队中
            if (t.left != null)
                queue.add(t.left);
            if (t.right != null)
                queue.add(t.right);
        }
        return res;
    }
}

主要部分就是while循环里的。

层次遍历的变换

既然会整个层次遍历,那如果我们要将每层分开呢?这样的题可以类似好几种,只要在该方法的基础上,我们实现分层,然后对每层进行功能实现便可以完成。

实现分层,我们只需要在遍历一层的时候,获取该层的结点个数size,然后对size个结点进行方法实现即可。

分层的层次遍历

例如LeetCode102,

主要代码如下

//用于保存数字,这里第一个<>里是List<Integer>,是因为要分层,每层相当于是一个数组
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        //缓冲队列
        LinkedList<TreeNode> queue = new LinkedLis
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值