0x01.问题
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:
[3,9,20,null,null,15,7],3 / \ 9 20 / \ 15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
public List<List<Integer>> levelOrder(TreeNode root)
0x02.简要分析
-
我们知道,如果要直接输出二叉树的中序遍历的话,很容易,只需要使用队列,第一次存入根节点,之后在每次输出对头元素之后,再继续把左右孩子节点入队。
-
其实把这个中序序列存入一个集合中,大体方法还是一样的,不过对于层级的划分,需要额外的考虑了,因为是二级集合,所以要确定每一层存入的是哪些节点。
- 最为容易想到的办法,是维护一个状态
(TreeNode,level)
,表示每个节点的层级,子树层级加1,最后根据层级再重新进行存储。但是,这需要消耗更多额外的空间,也没有更好的办法呢? - 我们知道,BFS在遍历的时候,是把左右孩子都存入队列中,那么在一层中存入的左右孩子,层级应该是相同的,也就是说,如果我们每次在BFS的时候,每次遍历完一层,就可以清楚的把层级相同的分个一个集合中,完成了最终的目的。
- 最为容易想到的办法,是维护一个状态
-
详细算法:
- (1)构造二级集合,如果
root
为空,直接返回。否则创建队列,并将根节点存入队列。 - (2)当队列不为空时,取出当前队列的长度
currSize
,遍历所有这一层的节点,并在遍历的时候完成节点的存储,左右孩子的入队。
- (1)构造二级集合,如果
0x03.解决代码–BFS
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans=new ArrayList<>();
if(root==null){
return ans;
}
Deque<TreeNode> q=new ArrayDeque<>();
q.addLast(root);
while(!q.isEmpty()){
int currSize=q.size();
List<Integer> f=new ArrayList<>();
for(int i=1;i<=currSize;i++){
TreeNode curr=q.removeFirst();
f.add(curr.val);
if(curr.left!=null){
q.addLast(curr.left);
}
if(curr.right!=null){
q.addLast(curr.right);
}
}
ans.add(f);
}
return ans;
}
}
ATFWUS --Writing By 2020–05-13