二叉树的层序遍历

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。..广度优先遍历的修改版。

 

 

 

/*

public class TreeNode {

    int val = 0;

    TreeNode left = null;

    TreeNode right = null;

 

    public TreeNode(int val) {

        this.val = val;

 

    }

 

}

*/

/**这里是广度优先遍历的变体。广度优先遍历不要求每一层输出一行。需要使用队列作为辅助

这里需要在过程中得到每一层的节点个数就可以了,用start和end标志表示,end表示每层节点的个数,start标志此层输出了多少个了。

*/

public class Solution {

    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {

        ArrayList<ArrayList<Integer>> result=new ArrayList<ArrayList<Integer>>();

             if(pRoot==null)

            return result;

        Queue<TreeNode> q=new LinkedList<TreeNode>();

        ArrayList<Integer> list=new ArrayList<Integer>();

        q.add(pRoot);

        int start=0,end=1;

        while(!q.isEmpty()){

         TreeNode node=q.remove();

            list.add(node.val);

            start++;//输出一个start就加一

            if(node.left!=null)

                q.add(node.left);

            if(node.right!=null){

                q.add(node.right);

            }

            if(start==end){//当输出个数与这一层的节点数相同时,表示这一层输出结束

                start=0;

                end=q.size();

                result.add(list);

                list=new ArrayList<Integer>();

               

            }

          

          

        }

       

       

        return result;

    }

   

}

 

也可以不使用start和end,上面的while换成下面形式。for循环用以输出当前层的所有节点,一个for循环表示一层

 while(!q.isEmpty()){

            int size=q.size();

            for(int i=0;i<size;i++){

                TreeNode node=q.poll();

                list.add(node.val);

                if(node.left!=null)

                     q.add(node.left);

                     if(node.right!=null){

                         q.add(node.right);

                        }

               

            }

            result.add(list);//将每层的输出加到总的输出中

            list=new ArrayList<>();

 

}

 

 

posted on 2017-12-11 19:37  夜的第八章  阅读(387)  评论(0编辑  收藏  举报

导航