剑指offer java版 test60—按行打印二叉树

  1. 题目

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

2. 二叉树的层次遍历,做之前,我们先来回顾一下二叉树的层次遍历。代码如下,思路很简单,我们建一个队列,先放第一行的结点,即根结点,然后放它的左右结点,再依次放左右结点的左右结点。再往队列里放的同时,我们依次进行pop()队列操作,保证我们的操作顺序。(文字表达可能有所欠缺,建议直接看代码)

import java.util.LinkedList;

class test2 {
    public static void levelOrder(TreeNode root){
        LinkedList<TreeNode> queue=new LinkedList<>();
        queue.add(root);
        while(queue!=null){
            TreeNode ret=queue.pop();
            System.out.println(ret.val);
            if(root.left!=null) queue.add(root.left);
            if(root.right!=null) queue.add(root.right);

        }
    }
}
  1. 那么本题的思路呢,我们需要在层次遍历的基础上,再队列里添加行分隔符,帮助我们判断这一行结束了没。队列里的情况大概是这样的:null,1,null,2,3,null,4,5,6,7null…(第一行1,第二行2,3;第三行4,5,6,7)值得注意的是,先有分隔符null,后有结点。nul后面表示的是下一行的几个结点,队列各元素依次出队,当未到分隔符时,我们把这一行元素的各左右结点加入队列,到达分隔符时,就代表这一行元素的各左右结点已经都添加到队列里来了,我们就将这些左右结点输出,并添加一个分隔符,因为这就是一行完了。然后不断循环,言语表达不到处,见代码。
  2. 代码
class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer> > ret=new ArrayList<>();
        if(pRoot==null) return ret;
        ArrayList<Integer> list=new ArrayList<>();
        LinkedList<TreeNode> queue=new LinkedList<>();
        queue.add(null);//层数分隔符
        queue.add(pRoot);


        while(queue.size()!=1){
            TreeNode node=queue.pop();//或者pop()方法也可以
            if(node==null){//到达层分隔符
                Iterator<TreeNode> iter=null;
                iter=queue.iterator();//从前往后遍历

                while(iter.hasNext()){
                    TreeNode temp=(TreeNode)iter.next();
                    list.add(temp.val);
                }
                ret.add(new ArrayList<Integer>(list));
                list.clear();
                queue.addLast(null);//插入分割符
                continue;//这个continue很关键
            }
            if(node.left!=null) queue.add(node.left);
            if(node.right!=null) queue.add(node.right);
        }
        return ret;
    }

}

class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值