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