力扣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。
上一篇:
92天倒计时,蓝桥杯省赛备赛攻略来啦~
下一篇:
【代码随想录—day_15】