题目:
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
思路:网上大神的代码。原文链接:https://blog.youkuaiyun.com/l294265421/article/details/51226156。
层次遍历二叉树就是按照层的顺序从左到右的访问二叉树中的元素。用一个队列进行辅助,用一个 LinkedList来存放每一层的元素,用一个ArrayList存放最后的结果集。将每一层的元素存入队列并且加入一个用于标记每一层结束的null。当遇到null之前,将队列中的元素依次加入到linkedlist中。因为最后一个null没有办法被访问到,导致保存最后一层元素的levelList没办法在循环中被添加进resultList。所以在循环外添加。代码为以下的代码1.
这个好像是二叉树的广度优先搜搜,不过需要注意一行什么时候结束。这个题是直接向得到一行的个数依次减1,到0时说明这一行已经结束。代码如代码2.
代码1:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> resultList = new ArrayList<List<Integer>>();
if (root == null) {
return resultList;
}
List<Integer> levelStorage = new LinkedList<Integer>();
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
queue.offer(null);
while (queue.size() > 1) {
TreeNode top = queue.poll();
if (top == null) {
resultList.add(levelStorage);
queue.offer(null);
levelStorage = new LinkedList<Integer>();
}
else {
levelStorage.add(top.val);
if (top.left != null) {
queue.offer(top.left);
}
if (top.right != null) {
queue.offer(top.right);
}
}
}
resultList.add(levelStorage);
return resultList;
}
}
代码2:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res=new ArrayList<>();
if(root==null)
return new ArrayList<>();
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
int level=queue.size();
List<Integer> list=new ArrayList<>();
while(level>=1){
TreeNode temp=queue.poll();
list.add(temp.val);
level--;
if(temp.left!=null)
queue.add(temp.left);
if(temp.right!=null)
queue.add(temp.right);
}
res.add(list);
}
return res;
}
}
LeetCode执行最快的代码:
以下使用递归的方法进行。递归时,将当前的根节点,结果集和一个标志位作为参数。当当前节点为空时,递归结束。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
int tier = 0;
List<List<Integer>> list = new ArrayList<List<Integer>>();
order(list, root, tier);
return list;
}
public static List<List<Integer>> order(List<List<Integer>> list,
TreeNode root, int tier) {
tier++;
if (root == null) {
return list;
}
if (list.size() <= tier - 1) {
list.add(new ArrayList<Integer>());
}
list.get(tier - 1).add(root.val);
order(list, root.left, tier);
order(list, root.right, tier);
return list;
}
}