二叉树层序遍历(返回一个不定长二维数组)

力扣_二叉树的层序遍历

题目中要求我们返回一个二维数组

List是一个接口,List<List<Integer>>就代表:

在List这个类型的数组中,存储着类型为List<Integer>类型的元素,而List<Integer>又是一个存储着Integer类型的一维数组。

java中支持不定长的二维数组(也就是每一行的元素数量是可以不相同的),因此我们可以直接用List接口,去存储每一层树的元素


好了,现在我们来正式看一下这道题目的解题思路。

先审题:

题目要求层序遍历二叉树,然后把每个节点的元素存储在二维数组中,然后返回这个二维数组。

那改如何实现层序遍历呢?

思路:

可以借助队列,这个数据结构去帮我们层序遍历

定义一个cur,cur先指向根节点,然后建立一个空队列,把cur节点Offer进队列。

下面建立一个循环,只要队列不为空,就一直执行循环

在循环中,用poll方法,出队列一个元素,用cur接收,把cur中的元素存储在二维数组中,至于怎么一层一层的存储最后将,先把整体思路捋一遍,把如何用队列层序遍历讲清楚。

再把cur节点的左节点入队(如果有)和右节点(如果有)分别按左右顺序入队

然后再出队一个元素,用cur接收,我们发现:

按照这个循环走下去,就会呈现出层序遍历。

以上就是用队列实现层序遍历的基本思路。


回到刚才的问题,我们该如果按层序遍历顺序的把每个元素存储在二维数组中?

其实并不难。

先建立一个List<Integer>类型的一维数组,存储每一层的元素。

在刚才演示的循环开头

获取当前队列所存的元素大小,在此循环中,在建立一个循环。

只要size不为零,就出队一个元素,把这个元素存储在List中,同时按照,左右顺序,入队两个元素。

最终,这个循环表达的意思就是,获取的size的大小,就是当前层节点数的大小,只要把size个节点存到一个一维数组中,同时按照左右顺序入队元素即可。

最后再把这个一维数组add到List<List<Integer>>这个二维数组中即可。

完整代码:

复制代码
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {

        List<List<Integer>> ret = new ArrayList<>();
        if (root == null) return ret;//如果树是空的,那么就没必要遍历,返回ret默认的空
        Queue<TreeNode> queue=new LinkedList<>();//创建一个队列用来存储一层的节点

        TreeNode cur=root;
        queue.offer(cur);
        while(!queue.isEmpty()){//队列不为空,就进入循环
            int size=queue.size();//计算队列当前层的大小,然后,分别出队,同时存储在二维数组

            List<Integer> list=new ArrayList();//每一层的数组

            while(size>0){  
                cur=queue.poll();//接收出队的节点,出队一个节点
                list.add(cur.val);//存储在数组中

                if(cur.left!=null){//左子树不是空,入队
                    queue.offer(cur.left);
                }
                if(cur.right!=null){//右子树不为空,入队
                    queue.offer(cur.right);
                }
                size--;
            }
            ret.add(list);
        }
return ret;
    }
}
相关推荐
晨曦夜月7 分钟前
map与unordered_map区别
算法·哈希算法
qeen8721 分钟前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码32 分钟前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler0140 分钟前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
minglie11 小时前
实数列的常用递推模式
算法
我星期八休息1 小时前
IT疑难杂症诊疗室:AI时代工程师Superpowers进化论
linux·开发语言·数据结构·人工智能·python·散列表
代码小书生1 小时前
math,一个基础的 Python 库!
人工智能·python·算法
AI科技星1 小时前
全域数学·数术本源·高维代数卷(72分册)【乖乖数学】
人工智能·算法·数学建模·数据挖掘·量子计算
生成论实验室1 小时前
《事件关系阴阳博弈动力学:识势应势之道》第一篇:生成正在发生——从《即事经》到事件-关系网络
人工智能·科技·算法·架构·创业创新
漂流瓶jz1 小时前
UVA-1152 和为0的4个值 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·二分查找·题解·aoapc·算法竞赛入门经典·uva