给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
解题思路:
层次遍历,优先想到广度优先搜索(BFS)和深度优先搜索(DFS)。解题要点为需要判断一层的末节点在那。
1)广度优先搜索
通过使用一个队列来解决问题。队列的先进先出,将每一层的全部入队列,然后再出队列并将其移除,寻找其左右节点,再入队列。
一开始将root入队列,队列的大小即为当前层的大小。
只要队列不为空就一直遍历,将队列中的第一个节点获取并移除(p.poll())。
只要当前的节点的左节点,右节点不为空,就添加进队列。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//定义结果集
List<List<Integer>> result = new ArrayList<>();
if(root == null)
return result;//不是都返回null的,这里返回result
Queue<TreeNode> queue = new LinkedList<TreeNode>();//队列
queue.add(root);//把根节点添加入队列
while(!queue.isEmpty()){//队列不为空即一直循环
List<Integer> list = new ArrayList<>();//定义一个每一层的list
int levelSize = queue.size();//队列中目前所存在的数即为当前层所有的数
for(int i = 0; i < levelSize; i++){
TreeNode currentNode = queue.poll();//获得并移除第一个节点在遍历的里面,这样才能将当前层的数全部从队列中移除
list.add(currentNode.val);//当前层的节点加入
if(currentNode.left != null)
queue.add(currentNode.left);//先把左节点加入队列
if(currentNode.right != null)
queue.add(currentNode.right);//再加入右节点
}
result.add(list);
}
return result;
}
}
2)深度遍历
解题思路:在于判断所在的那一层(级)。 通过获取result的大小对level进行判断。如果result的大小和level相等,说明该result中第一次出现这个level,新建一个list添加进去。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//定义结果集
List<List<Integer>> result = new ArrayList<>();
//递归等级
int level = 0;
return dfs(root,level,new ArrayList<>());
}
private List<List<Integer>> dfs(TreeNode root,int level,List<List<Integer>> result){
//递归终止条件
if(root == null)
return new ArrayList<>();
//定义一个每一层的list
List<Integer> currentList;
//如果当前层没有结果,即当前的result的大小 等于level,因为每添加一个list,result的大小就会加1。
if(result.size() == level){
currentList = new ArrayList<>();
currentList.add(root.val);
result.add(currentList);
}else{
currentList = result.get(level);//获得已存在的level
currentList.add(root.val);
result.set(level,currentList);//将新输入的list放回原来所在的result的位置
}
dfs(root.left,level + 1,result);
dfs(root.right,level + 1,result);
return result;
}
}