leetcode微软谷歌面试题102. Binary Tree Level Order Traversal

来源:互联网 发布:淘宝c店会员积分 编辑:程序博客网 时间:2024/06/01 07:11

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 stubTreeNode 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后才能获取。



0 0