剑指offer(63):多行打印二叉树

题目描述

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

分析

前面的文章剑指offer(24):从上往下打印二叉树提到,在二叉树的层序遍历中,使用Queue队列的“先进先出”特性保存访问节点的左右子节点,只需要使用一个ArrayList保存遍历的结果输出即可。

此处与前面的二叉树层序遍历类似但又不同的是,每一行需要单独打印。那么每一行都是一个单独的ArrayList存储,将每一个单独的ArrayList添加到总ArrayList中即可。此外还需要两个变脸:一个变量表示当前层中还没有打印的节点数,另一个变量表示下一层的节点数。比较总ArrayList的size和二叉树的层数可以判断是否需要产生新的单独ArrayList(新行)。

牛客AC:

import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

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

    }

}
*/
public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
        if(pRoot == null)
            return list;

        int countLevel = 0;     // 二叉树的层数
        int countNodeToBePrinted = 1;   // 当前层尚未打印的节点数
        int countNodeNextLevel = 0;     // 下一层的节点数

        // 队列记录节点的左右子树节点
        // LinkedList实现了Queue和Stack接口
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(pRoot);
        while(!queue.isEmpty()) {
            // list的size小于层数,需要增加新的list,保存下一层
            if(list.size() <= countLevel)
                list.add(new ArrayList<Integer>());

            ArrayList<Integer> curList = list.get(countLevel);
            TreeNode pNode = queue.poll();
            curList.add(pNode.val);     // 相当于打印,则尚未打印的节点数减去1
            countNodeToBePrinted--;

            // 左右子节点不为空,则入队
            if(pNode.left != null) {
                queue.offer(pNode.left);
                countNodeNextLevel++;
            } 
            if(pNode.right != null) {
                queue.offer(pNode.right);
                countNodeNextLevel++;
            }

            // 当前层全部打印完毕,转到下一层,更新变量
            if(countNodeToBePrinted == 0) {
                countLevel++;
                countNodeToBePrinted = countNodeNextLevel;
                countNodeNextLevel = 0;
            }
        }
        return list;
    }

}

参考
1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值