二叉树按层遍历

题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行
方法一:一个队列实现
先将根节点入队列,需要一个变量记录当前层的结点个数 end=queue.size(),第一次循环end=1;
根节点出队列,根节点有左孩子,左孩子入队列,有右孩子右孩子入队列,完成后队列中有2个节点(假设左右孩子都在),记录当前层的结点个数 end=queue.size(),这两个结点依次出队列,并将其左右孩子入队列,依次循环。

public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer> > listLevel=new ArrayList<ArrayList<Integer> >();
        Queue<TreeNode> queue=new LinkedList<TreeNode>();

        if(pRoot==null)
            return listLevel;
        queue.offer(pRoot);
        while(!queue.isEmpty()){
            ArrayList<Integer> arrayList=new ArrayList<Integer>();
            int lo=0,end=queue.size();
                while(lo++<end){
                    TreeNode node=queue.poll();
                    arrayList.add(node.val);
                    if(node.left!=null)
                        queue.offer(node.left);
                    if(node.right!=null)
                        queue.offer(node.right);

                }
                if(arrayList.size()>0)
                  listLevel.add(arrayList);  
            }
        return listLevel;
        } 
}

方法二:两个队列实现
1根结点入queue1
2根节点出queue1,根节点左右孩子入queue2,第一次循环后queue1为空
3queue2中的结点依次出队列,左右孩子入queue1,第二次循环完后queue2为空
4依次交替循环

public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer> > listLevel=new ArrayList<ArrayList<Integer> >();
        Queue<TreeNode> queue1=new LinkedList<TreeNode>();
        Queue<TreeNode> queue2=new LinkedList<TreeNode>();

        if(pRoot==null)
            return listLevel;
        queue1.offer(pRoot);
        while((!queue1.isEmpty())||(!queue2.isEmpty())){
          ArrayList<Integer> arrayList=new ArrayList<Integer>();
        while(!queue1.isEmpty()){

            TreeNode treeNode = queue1.poll();
            arrayList.add(treeNode.val);
            if(treeNode.left!=null)
                queue2.offer(treeNode.left);
            if(treeNode.right!=null)
                queue2.offer(treeNode.right);

        }
            if(arrayList.size()>0)
            listLevel.add(arrayList);

            arrayList=new ArrayList<Integer>();

            //交换两个队列
          //  listLevel.add(arrayList);
          //  swap(queue1,queue2);
             while(!queue2.isEmpty()){
            TreeNode treeNode = queue2.poll();
            arrayList.add(treeNode.val);
            if(treeNode.left!=null)
                queue1.offer(treeNode.left);
            if(treeNode.right!=null)
                queue1.offer(treeNode.right);

        }
            if(arrayList.size()>0)
              listLevel.add(arrayList);


        }

        return listLevel;

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值