剑指offer(63):多行打印二叉树
来源:互联网 发布:域名有什么商业价值 编辑:程序博客网 时间:2024/06/03 15:46
题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
分析
前面的文章剑指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名企面试官精讲典型编程题(纪念版),电子工业出版社
0 0
- 剑指offer(63):多行打印二叉树
- 剑指offer:多行打印二叉树
- 剑指offer-将二叉树打印为多行
- 剑指offer-----多行打印二叉树(java版)
- 《剑指offer》按之字行顺序打印二叉树
- 剑指 offer:从上到下打印二叉树(层序遍历)
- 剑指offer(24):从上往下打印二叉树
- 剑指offer(62):之字形打印二叉树
- 剑指offer(19)-从上往下打印二叉树
- 剑指offer(56)-按之字形顺序打印二叉树
- 剑指offer(57)-把二叉树打印成多行
- 剑指offer:往上到下打印二叉树(java)
- 【剑指offer-解题系列(22)】从上到下打印二叉树
- 剑指offer——之字形打印二叉树(一般)
- java面试题(剑指offer):之字形打印二叉树
- 剑指offer之从上到下打印二叉树(Python)
- 剑指offer之把二叉树打印成多行(Python)
- 剑指offer 编程题(21):二叉树层次打印
- 移动SDK介绍
- 实现Struts2中对未登录的jsp页面进行拦截功能(采用的是Struts2中过滤器进行过滤拦截)
- hdu1069 dp动态规划
- 【软件工程】 文档 - 银行业务管理 - 结构化设计
- 插入图片
- 剑指offer(63):多行打印二叉树
- 异常 axis2服务的webservice 改造让其被dubbo监控
- JAVA ArrayList
- Quartz
- ZOJ - 3879 Capture the Flag (模拟)题意难懂的水题
- eclipse 创建 maven springmvc工程
- EventBus,RxBus相关介绍
- 太阳高度角/方位角计算公式
- 平衡二叉树Java语言实现