题目描述
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]
]
解题思路
将二叉树按照层级的方式遍历,利用两个队列,将树中的元素隔层的添加到不同的队列中,然后判断哪个队列不为空,取出队列中的元素添加到列表中即可。
代码
/**
* 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<List<Integer>>();
if(root == null)
return result;
Queue<TreeNode> queue1 = new LinkedList<TreeNode>();
Queue<TreeNode> queue2 = new LinkedList<TreeNode>();
queue1.add(root);
while(queue1.size()!=0 || queue2.size()!=0){
List<Integer> local = new ArrayList<Integer>();
if(queue1.size() != 0){
while(queue1.peek() != null){
TreeNode tmp = queue1.poll();
local.add(tmp.val);
if(tmp.left != null){
queue2.add(tmp.left);
}
if(tmp.right != null)
queue2.add(tmp.right);
}
result.add(local);
}else{
while(queue2.peek() != null){
TreeNode tmp = queue2.poll();
local.add(tmp.val);
if(tmp.left != null)
queue1.add(tmp.left);
if(tmp.right != null)
queue1.add(tmp.right);
}
result.add(local);
}
}
return result;
}
}
可以使用一个队列来完成操作,开始循环之前,记录当前队列中元素的个数(即为当前层节点的个数m),那么当前层的循环只取出队列中的前m个节点即可。
/**
* 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<List<Integer>>();
if(root == null)
return result;
Queue<TreeNode> queue1 = new LinkedList<TreeNode>();
//Queue<TreeNode> queue2 = new LinkedList<TreeNode>();
queue1.add(root);
while(queue1.size()!=0 ){
List<Integer> local = new ArrayList<Integer>();
int size = queue1.size();
for(int i=0;i<size;i++){
TreeNode tmp = queue1.poll();
local.add(tmp.val);
if(tmp.left != null)
queue1.add(tmp.left);
if(tmp.right != null)
queue1.add(tmp.right);
}
result.add(local);
}
return result;
}
}
递归的方式求解
/**
* 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<List<Integer>>();
if(root == null)
return result;
recursionCore(root,result,1);
return result;
}
private void recursionCore(TreeNode root,List<List<Integer>> result,int level){
if(root == null)
return;
if(result.size() < level){
result.add(new ArrayList<Integer>());
}
result.get(level-1).add(root.val);
recursionCore(root.left,result,level+1);
recursionCore(root.right,result,level+1);
}
}