新手算法学习之路----宽度优先算法

题目:给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)

给一棵二叉树 {3,9,20,#,#,15,7} :

  3
 / \
9  20
  /  \
 15   7

返回他的分层遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

思路:宽度优先的步骤是,从图中某一个顶点出发,首先访问vi 然后任选一个vi 的未访问的过的邻接点vj,就这样继续访问下去。
java代码:
public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
        // write your code here
        ArrayList result = new ArrayList();
        if(root == null){
            return result;
        }
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        while(!queue.isEmpty()){
          ArrayList<Integer> g = new ArrayList<Integer>();
          int size = queue.size();
          for(int i =0; i < size;i++){  //这里如果把size直接写成queue.seize()结果就会成为【1,2】,3;原因是:由于如果使用了queue.size的话,那么在for循环的第二次的时候queue里面已经执行了两次poll操作了,这时候queue的size值就又为二了。作者真是太聪明了,我检查了好久都没有发现
            TreeNode head = queue.poll();
            g.add(head.val);
            if(head.left!=null){
                queue.offer(head.left);
            }
            if(head.right!=null){
                queue.offer(head.right);
            }
           }
            result.add(g);
        }
        return result;
    }

 

posted @ 2017-07-28 21:13  JunLiu37  阅读(1274)  评论(0编辑  收藏  举报