二叉树的层序遍历

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

 

 

 

/*

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<>();

 

}

 

 

转载于:https://www.cnblogs.com/xiaolovewei/p/8024720.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值