102. Binary Tree Level Order Traversal
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] ]
这道题是树的层序遍历题,也是广度搜索,题目的大致意思就是遍历二叉树,将每一层的节点值拼装成一个序列,最后将所有的序列拼装成一个
大的序列,并且返回该序列。
下面给出一段最简单的层序遍历代码,该代码是最基本的层序遍历代码,层序遍历一般都会借助队列实现。如果队列不为空就将队列该节点出队,并将该队列的不为空的左右孩子入队,直到队列为空,才把节点遍历完全
public static void levelOrder(TreeNode root) {
Queue queue = new LinkedList() ;
queue.add(root);
if(root == null)
return;
while(!queue.isEmpty())
{
TreeNode temp = (TreeNode) queue.poll();
System.out.println(temp.val+" ");
if(temp.left != null)
queue.add(temp.left);
if(temp.right != null)
queue.add(temp.right);
}
}
这道题的层序遍历也是我们在这个基础上做的,首先遍历完每层节点后我们都添加一个标识为,该标志位我们设置为null。
这样我们每次出队一个节点node,并将node的不为空的左右孩子入队,直到发现队列里的节点node为null时就说明该节点
上一层的节点全部遍历完全,并且已经将上一层所有节点的左右孩子都已经入队列,这时队列入队null,标志该层次结束。
每次判断队列时,队列的大小必须得大于1,因为最后一个节点一定是null节点。
代码如下
public class binarytreeleveltraversal {
public static List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> lists = new LinkedList();
Queue<TreeNode> queue = new LinkedList();
if(root == null)
return lists;
List list = new LinkedList();
//设置一个标志,如果说发现null标志的话就说明这一层完结
queue.add(root);
queue.add(null);
while(queue.size()>1)//因为最后一个节点一定是null
{
TreeNode node = queue.poll();
if(node == null)
{
lists.add(list);
queue.add(null);
list = new LinkedList();//每次到下一层时就重新生成list对象
}
else
{
list.add(node.val);
if(node.left!=null)
{
queue.add(node.left);
}
if(node.right!=null)
{
queue.add(node.right);
}
}
}
lists.add(list);//最后一次遍历组装的list拼装到lists
return lists;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeNode root = new TreeNode(1);
TreeNode root1 = new TreeNode(4);
TreeNode root2 = new TreeNode(2);
TreeNode root3 = new TreeNode(3);
root.left = root1;
root.right = root2;
root2.left = root3;
System.out.println(levelOrder( root));
}
}
刚开始做这道题时一直在想存储遍历内容的数据结构,也发现了一些问题,比如:如果lists的size<=你获取址的index的话,就会出现错误,所以list并不想数组一样,它没有内容时不能用get方法,只有add后才能获取。