题目:
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,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
return its level order traversal as:
[ [3], [9,20], [15,7] ]
解题思路: 用队列来存放TreeNode,依次将每一层放入到队列中,取值即可。
贴完整代码方便大家调试,因为自己本身是新手,为了提高正确率,会自己写例子实现。提交的时候只需要levelOrder 即可。
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class isBalanced {
public static List<List<Integer>> levelOrder(TreeNode root){
Queue <TreeNode> que = new LinkedList<TreeNode>();
List<List<Integer>> re = new ArrayList<List<Integer>>();
List<Integer> ro = new ArrayList<Integer>();
TreeNode tmp = root;
if(tmp == null) {
return re;
}
que.offer(tmp);
while(!que.isEmpty()){
Queue <TreeNode> que1 = new LinkedList<TreeNode>();
while(!que.isEmpty()){
tmp = que.peek();
ro.add(tmp.val);
que.poll();
if(tmp.left != null)
que1.offer(tmp.left);
if(tmp.right != null)
que1.offer(tmp.right);
}
List<Integer> roo = new ArrayList<Integer>(ro);
re.add(roo);
ro.clear();
que = que1;
}
return re;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeNode root = new TreeNode(3);
TreeNode rl = new TreeNode(9);
TreeNode rr = new TreeNode(20);
TreeNode rrl = new TreeNode(15);
TreeNode rrr = new TreeNode(7);
root.left = rl;
root.right = rr;
rr.left = rrl;
rr.right = rrr;
List<List<Integer>> a = levelOrder(root);
System.out.println(a);
}
}
编码过程中有几个小问题MARK之:
1、 用ctrl + shift + o 自动导入包的时候LIST包的选择有误,应该选util的
2、之前不熟悉java中队列对应的方法,常用的方法有:
offer() 和 add() 都可以实现push 操作但是队列为空的时候offer()方法不会报错,add()会报错。
poll() 实现了pop 操作
peak() 则是取出队列中的第一个元素。
3、最初的时候并没有引入 roo ,得到的结果是全空。 我认为可能是ro 分配的时候指向了一个地址,clear()之后re中ro指向的地方被clear掉了。 因此引入了roo 。
具体的原因求大神解释,之前用到list的时候出现过很多次这样的情况。