给定一个二叉树,返回其节点值的级别顺序遍历。(即,从左到右,逐级)。
例如:
给定二叉树{3,9,20,#,#,15,7},
3
/ \
9 20
/ \
15 7
返回其级别顺序遍历为[[3],[9,20],[15,7]]
Java解决方案1
显然,可以使用队列解决此问题。但是,如果我们使用一个队列,我们将无法跟踪每个级别的启动时间。因此,我们使用两个队列来跟踪当前级别和下一个级别。
public ArrayList> levelOrder(TreeNode root) {
ArrayList> al = new ArrayList>();
ArrayList nodeValues = new ArrayList();
if(root == null)
return al;
LinkedList current = new LinkedList();
LinkedList next = new LinkedList();
current.add(root);
while(!current.isEmpty()){
TreeNode node = current.remove();
if(node.left != null)
next.add(node.left);
if(node.right != null)
next.add(node.right);
nodeValues.add(node.val);
if(current.isEmpty()){
current = next;
next = new LinkedList();
al.add(nodeValues);
nodeValues = new ArrayList();
}
}
return al;}
Java解决方案2
我们还可以通过使用整数队列跟踪级别而不是跟踪节点的另一个级别来改进解决方案1。
public List> levelOrder(TreeNode root) {
List> result = new ArrayList<>();
if(root==null){
return result;
}
LinkedList nodeQueue = new LinkedList<>();
LinkedList levelQueue = new LinkedList<>();
nodeQueue.offer(root);
levelQueue.offer(1);//start from 1
while(!nodeQueue.isEmpty()){
TreeNode node = nodeQueue.poll();
int level = levelQueue.poll();
List l=null;
if(result.size()
l = new ArrayList<>();
result.add(l);
}else{
l = result.get(level-1);
}
l.add(node.val);
if(node.left!=null){
nodeQueue.offer(node.left);
levelQueue.offer(level+1);
}
if(node.right!=null){
nodeQueue.offer(node.right);
levelQueue.offer(level+1);
}
}
return result;}
最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。