剑指Offer——将二叉树打印成多行

题目描述

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

相比较层次遍历二叉树,这个地方要求每输出一行都需要换行。

重点思考的地方也就是,如何判断一行打印完了,进行下一行的打印。

解题思路

先从层次遍历开始,借用队列结构,会依次把下一层的结点加入队列中。

那么如何判断一行打印完了?

实际上一次操作的过程中,我们会涉及到当前层结点的出队,和下一层结点的入队。

那么我们可以维护两个整型变量,来记录一层结点的数目情况。一次循环中,当前层结点减一,下一层结点(左或右结点入队)数目加一。当我们当前层的结点数为0,也就是这一层遍历完了,我们可以进行换行,同时进入遍历下一层。此时:当前层 = 下一层结点数,下一层结点数目 =0。

题解

牛客网提交写法:

    ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        LinkedList<TreeNode> queue = new LinkedList<>();
        if (pRoot == null) return result;
        queue.add(pRoot);
        int numOfcurrent = 1;
        int numOfnext = 0;
        ArrayList<Integer> temp = new ArrayList<>();
        while(!queue.isEmpty()){
            // 默认remove 第一个元素
            TreeNode p = queue.remove();
            temp.add(p.val);
            numOfcurrent--;
            if (p.left != null){
                queue.add(p.left);
                numOfnext++;
            }
            if (p.right != null){
                queue.add(p.right);
                numOfnext++;
            }
            if (numOfcurrent == 0){
                numOfcurrent = numOfnext;
                numOfnext = 0;
                result.add(temp);
                temp = new ArrayList<>();
            }
        }
        return result;
    }

实际面试过程中,如果要求直接输出的话。代码可以更改为如下:

    public  void Print(TreeNode root){
        LinkedList<TreeNode> queue = new LinkedList<>();
        if (root == null)
            throw new IllegalArgumentException("error ");
        queue.add(root);
        int current = 1;
        int next = 0;
        while(! queue.isEmpty()){
            TreeNode p = queue.remove();
            System.out.printf("%d \t",p.val);
            current--;
            if (p.left != null){
                queue.add(p.left);
                next++;
            }
            if (p.right!=null){
                queue.add(p.right);
                next++;
            }
            // 更新当前层和下一层的结点数目
            if (current == 0){
                current = next;
                next = 0;
                System.out.println();
            }
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据结构和算法--二叉树的实现 几种二叉树 1、二叉树 和普通的树相比,二叉树有如下特点: 每个结点最多只有两棵子...
    sunhaiyu阅读 11,585评论 0 14
  • 1. 二叉树的深度 分析:如果一棵树只有一个结点,它的深度为1。否则树的深度就是其左、右子树深度的较大值再加1。 ...
    HungerDeng阅读 3,490评论 0 0
  • 树 记录《剑指offer》中所有关于树的题目,以及LeetCode中的相似题目。 相关题目列表 题目 树是一种最常...
    wenmingxing阅读 5,281评论 2 13
  • 描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 思路:原型为层次遍历,因为要每一行换行输出...
    大数据Zone阅读 1,522评论 0 0
  • 本文首发于我的个人博客:尾尾部落 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 解题...
    繁著阅读 1,391评论 0 0

友情链接更多精彩内容