力扣102二叉树的层序遍历

在这里插入图片描述

    二叉树的层序遍历大家应该都知道,如果让直接输出遍历结果应该是没什么问题的,但是,这个题它得分层存,分层输出,这个就稍稍有点麻烦,这个时候我们就得知道,一层有多少个数字需要存入到集合中。我们现在来分析分析,每一个根结点的左右结点都需要入队,而左右结点入队只需要一次循环即可,所以有几个根结点就需要遍历几次循环,队列里存的就是遍历到当层根结点的数量,所以循环控制变量就是队列的长度。

class Solution{
    
    
    public List<List<Integer>> levelOrder(TreeNode root) {
    
    
        if(root == null)
            return new ArrayList<>();
        List<List<Integer>> res = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);//先将根结点加入队列
        while(!queue.isEmpty()){
    
    
            int count = queue.size();
            List<Integer> list = new ArrayList<Integer>();
            while(count > 0){
    
    
                TreeNode node = queue.poll();//将根结点poll出来
                list.add(node.val);//打印根结点
                if(node.left != null)
                //如果根结点的左孩子不为空,就将它加入到队列中
                    queue.add(node.left);
                if(node.right != null)
                //如果根结点的右孩子不为空,就将它加入到队列中
                    queue.add(node.right);
                count--;
            }
            res.add(list);
        }
        return res;
    }

 }

现在来分析下这个代码:
    定义一个队列用来存结点,首先将root加入到队列中,外面的大循环控制条件就是队列不为空,里面的小循环的控制条件就是队列的大小,内层循环就是先得到根结点(根结点出队),如果根结点的左孩子不为null,左孩子入队,如果根结点的右孩子不为null,根结点的右孩子入队,队的长度-1(因为根结点出去了)。
现在来走一下样例:
    先将3加入到队列里面,队列不为空,进入外层循环,count=1,进入内层循环,3出队,3的左孩子为9,入队,3的右孩子为20,入队,count–,内层循环结束;现在队列里有两个结点9,20,队列不为空,进入外层循环,count=2>0,进入内层循环,9出队,9的左孩子为null,9的右孩子为null,count减1,20出队,20的左孩子15,入队,20的右孩子7,入队,count-1=0.内层循环结束。队列里有15,7,count=2>0,进入内层循环,15出队,15的左孩子为null,15的右孩子为null,count–,7出队,7的左右孩子都为null,count–,内层循环结束。队列为空,外层循环结束。返回res。

猜你喜欢

转载自blog.csdn.net/weixin_51656756/article/details/121229283
今日推荐