原题:
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]
]
解题思路:先考虑最简单的情况,按照层序遍历的方式输出节点的值,也就是说不分别存储每一层的节点。基本思路就是:设置一个队列,并首先把根节点入队。1.当队列不为空时,把队首元素出队并打印输出;2.如果存在子节点则把左右子节点分别入队;循环1.2两步直到队列为空。程序如下:
<span style="font-size:18px;">private static void levelOrderTraversal(TreeNode root) {
if(root == null){
return ;
}
LinkedList<TreeNode>nodeQueue=new LinkedList<TreeNode>();
nodeQueue.add(root);
while(!nodeQueue.isEmpty())
{
TreeNode anode=nodeQueue.poll();
System.out.print(anode.val);
if(anode.left!=null){nodeQueue.add(anode.left); }
if(anode.right!=null){nodeQueue.add(anode.right); }
}
}</span>上面的程序只考虑了最简单的情形,只需要按照层序遍历的顺序输出节点值,但是无法判断各个节点所在的层次。如果需要考虑层次问题,则要进一步改进。改进后的程序如下:
<span style="font-size:18px;">public static List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> list=new ArrayList<List<Integer>>();
if(root == null){
return list;
}
LinkedList<TreeNode>nodeQueue=new LinkedList<TreeNode>();
nodeQueue.add(root);
while(!nodeQueue.isEmpty())
{
TreeNode lastNode=nodeQueue.getLast();
ArrayList<Integer> alist=new ArrayList<Integer>();
while(nodeQueue.getFirst()!=lastNode)
{
TreeNode firstNode=nodeQueue.getFirst();
alist.add(firstNode.val);
if(firstNode.left!=null)nodeQueue.add(firstNode.left);
if(firstNode.right!=null)nodeQueue.add(firstNode.right);
nodeQueue.removeFirst();
}
alist.add(lastNode.val);
if(lastNode.left!=null)nodeQueue.add(lastNode.left);
if(lastNode.right!=null)nodeQueue.add(lastNode.right);
nodeQueue.removeFirst();
list.add(alist);
}
return list;
}</span>可以看出,程序的思路还是差不多,不过这次是在大循环里面加入了另一个循环,这个循环用来处理每一层的节点。稍微改进则可以得到另一个程序:Binary
Tree Zigzag Level Order Traversal,改进的思路是:增加一个变量来标志层次遍历的方向,如果该标志为false,那么说明是从左往右,在遍历该层节点时,把每个节点加入到List的尾部;如果该标志为true,那么说明是从右往左,在遍历该层节点时,把每个节点加入到List的首部。程序如下:
public static List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> list=new ArrayList<List<Integer>>();
if(root == null){
return list;
}
boolean rightToLeft=false;
LinkedList<TreeNode>nodeQueue=new LinkedList<TreeNode>();
nodeQueue.add(root);
while(!nodeQueue.isEmpty())
{
TreeNode lastNode=nodeQueue.getLast();
LinkedList<Integer> alist=new LinkedList<Integer>();
while(nodeQueue.getFirst()!=lastNode)
{
TreeNode firstNode=nodeQueue.getFirst();
if(rightToLeft)alist.addFirst(firstNode.val);
else alist.addLast(firstNode.val);
if(firstNode.left!=null)nodeQueue.add(firstNode.left);
if(firstNode.right!=null)nodeQueue.add(firstNode.right);
nodeQueue.removeFirst();
}
if(rightToLeft)alist.addFirst(lastNode.val);
else alist.addLast(lastNode.val);
if(lastNode.left!=null)nodeQueue.add(lastNode.left);
if(lastNode.right!=null)nodeQueue.add(lastNode.right);
nodeQueue.removeFirst();
list.add(alist);
rightToLeft=!rightToLeft;
}
return list;
}原文地址:http://blog.csdn.net/dhc123321/article/details/39500819