Leetcode102. Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).
For example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
思路
如何遍历一棵树
有两种通用的遍历树的策略:
-
深度优先搜索(
DFS
)
在这个策略中,我们采用深度作为优先级,以便从跟开始一直到达某个确定的叶子,然后再返回根到达另一个分支。
深度优先搜索策略又可以根据根节点、左孩子和右孩子的相对顺序被细分为先序遍历,中序遍历和后序遍历。 -
宽度优先搜索(
BFS
)
我们按照高度顺序一层一层的访问整棵树,高层次的节点将会比低层次的节点先被访问到。
下图中的顶点按照访问的顺序编号,按照 1-2-3-4-5
的顺序来比较不同的策略。
本问题就是用宽度优先搜索遍历来划分层次:[[1], [2, 3], [4, 5]]
。
BFS
在访问过程中,我们只需要将同一层中的节点同时入队列即可。在将该queue中所有元素出队列的同时,将下一层的元素进队列,完成交接。
递归
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(); //取出当前节点
list.add(node.val); //保存当前节点值
if(node.left != null)
queue.add(node.left); //下一层左节点入队列
if(node.right != null)
queue.add(node.right); //下一层右结点入队列
count--;
}
res.add(list); //将当前层的结点值存到res中
}
return res;
}
迭代
这题考的是BFS,但是可以通过 DFS 实现。只需要在递归过程中将当前 level 传入即可。
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans = new ArrayList<>();
DFS(root, 0, ans);
return ans;
}
private void DFS(TreeNode root, int level, List<List<Integer>> ans) {
if(root == null){
return;
}
//当前层数还没有元素,先 new 一个空的列表
if(ans.size()<=level){
ans.add(new ArrayList<>());
}
//当前值加入
ans.get(level).add(root.val);
DFS(root.left,level+1,ans);
DFS(root.right,level+1,ans);
}