【Offer】[32] 【从上到下打印二叉树】
题目描述
不换行:从上到下打印出二叉树的每个节点,同层的节点按照从左到右的顺序打印。例如,输入下图的二叉树,则依次打印出8,6,10,5,7,9,11。
要换行:从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行
8
6 10
5 7 9 11
之字形:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。打印结果应为:
8
10 6
5 7 9 11
二叉树节点的定义如下:


思路分析
其实就是二叉树的层次遍历,借助队列实现
之字形打印:需要两个栈实现
测试用例
- 功能测试:完全二叉树;所有节点只有左子树的二叉树;所有节点只有右子树的二叉树。
- 特殊输入测试:二叉树根节点为nullptr 指针;只有一个节点的二叉树。
Java代码
public class Offer32 {
public static void main(String[] args) {
test1();
test2();
test3();
}
public static List PrintFromTopToBottom(TreeNode root) {
return Solution3(root);
}
private static ArrayList<Integer> Solution1(TreeNode root) {
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
ArrayList<Integer> list = new ArrayList<Integer>();
if(root==null){
return list;
}
queue.offer(root);
TreeNode node = null;
while(queue.size()!=0){
node = queue.poll();
list.add(node.val);
if(node.left!=null){
queue.offer(node.left);
}
if(node.right!=null){
queue.offer(node.right);
}
}
return list;
}
private static ArrayList<ArrayList<Integer>> Solution2(TreeNode root) {
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> levelList = null;
if(root == null){
return list;
}
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
int nextLevel= 1; //下层节点个数
int toBePrinted = 0 ;//当前层还需要打印的节点个数
TreeNode node =null;
while(queue.size()!=0){
toBePrinted = nextLevel;
nextLevel = 0;
levelList = new ArrayList<Integer>();
for(int i=1;i<=toBePrinted;i++){
node = queue.pop();
levelList.add(node.val);
if(node.left!=null){
queue.offer(node.left);
nextLevel ++ ;
}
if(node.right!=null){
queue.offer(node.right);
nextLevel ++ ;
}
}
list.add(levelList);
}
return list;
}
private static ArrayList<ArrayList<Integer>> Solution3(TreeNode root) {
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> levelList = null;
if(root==null) {
return list;
}
Stack<TreeNode> stack1 = new Stack<TreeNode>();
Stack<TreeNode> stack2 = new Stack<TreeNode>();
stack1.push(root);
TreeNode node =null;
while(!stack1.isEmpty() || !stack2.isEmpty()) {
if(!stack1.isEmpty()) {
levelList = new ArrayList<>();
while(!stack1.isEmpty()) {
node = stack1.pop();
levelList.add(node.val);
if(node.left!=null) {
stack2.push(node.left);
}
if(node.right!=null) {
stack2.push(node.right);
}
}
list.add(levelList);
}else {
levelList = new ArrayList<>();
while(!stack2.isEmpty()) {
node = stack2.pop();
levelList.add(node.val);
if(node.right!=null) {
stack1.push(node.right);
}
if(node.left!=null) {
stack1.push(node.left);
}
}
list.add(levelList);
}
}
return list;
}
@SuppressWarnings("unused")
private static void test1() {
TreeNode root = new TreeNode(8);
TreeNode node1 = new TreeNode(6);
TreeNode node2 = new TreeNode(10);
TreeNode node3 = new TreeNode(5);
TreeNode node4 = new TreeNode(7);
TreeNode node5 = new TreeNode(9);
TreeNode node6 = new TreeNode(11);
root.left=node1;
root.right=node2;
node1.left=node3;
node1.right=node4;
node2.left=node5;
node2.right=node6;
TreeNode.preOrder(root);
System.out.println();
ArrayList<ArrayList<Integer>> list = (ArrayList<ArrayList<Integer>>) PrintFromTopToBottom(root);
// Solution3(root);
System.out.println(list);
}
private static void test2() {
}
private static void test3() {
}
}
代码链接
【Offer】[32] 【从上到下打印二叉树】的更多相关文章
- 【Java】 剑指offer(32) 从上往下打印二叉树
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 (一)从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺 ...
- 剑指offer——32从上到下打印二叉树
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 题解: 就是简单的层序遍历 class Solution { public: vector<int> PrintFro ...
- 《剑指offer》从上往下打印二叉树
本题来自<剑指offer> 从上往下打印二叉树 题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 队列的思想. 先将根节点加入,当取该节点时候,依次将左右子树加入,直 ...
- 【剑指Offer】从上往下打印二叉树 解题报告(Python)
[剑指Offer]从上往下打印二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- 剑指Offer 22. 从上往下打印二叉树 (二叉树)
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 题目地址 https://www.nowcoder.com/practice/7fe2212963db4790b57431d9ed25 ...
- 剑指offer系列20--从上到下打印二叉树
* 20 [题目]从上往下打印出二叉树的每个节点,同层节点从左至右打印. * [思路]从根结点开始,先保存结点,再看根结点的左右结点有没有值. * 有,就将左右值放到集合中: * 根节点输出后,打印根 ...
- 【剑指offer】从上向下打印二叉树
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26089165 剑指offer上的第23题,实际上就是考察二叉树的层序遍历,详细思想能够參考 ...
- Go语言实现:【剑指offer】从上往下打印二叉树
该题目来源于牛客网<剑指offer>专题. 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 不需分层,一维数组. Go语言实现: /** * Definition for a bi ...
- 剑指OFFER之从上往下打印二叉树(九度OJ1523)
题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, : ...
- 剑指offer:从上往下打印二叉树
题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路: 实际就是二叉树的中序遍历问题.之前在leetcode刷过类似题目. 利用队列完成即可. 代码: /* struct Tr ...
随机推荐
- awk文本处理
一.前言 (一).awk简介 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理,数据可以来自标准输入.一个或多个文件,或其它命令的输出,它支持用户自定义函数和动态正则表达式等先进 ...
- Transformation HDU - 4578(线段树——懒惰标记的妙用)
Yuanfang is puzzled with the question below: There are n integers, a 1, a 2, …, a n. The initial val ...
- sql存储过程中循环批量插入
前几天有一个需求很头痛,部门是有上下级关系的,在给部门的经理赋予角色和权限的时候,通常我们都会认为假如经理A的部门是1,那么我给了他部门1 的管理权限,那么1的下级部门101,102,103 &quo ...
- Java实现ZooKeeper的zNode监控
上一篇文章已经完成了ZooKeeper的基本搭建和使用的介绍,现在开始用代码说话.参考 https://zookeeper.apache.org/doc/current/javaExample.htm ...
- ASP.NET Core on K8S深入学习(4)你必须知道的Service
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 前面几篇文章我们都是使用的ClusterIP供集群内部访问,每个Pod都有一个 ...
- 【java提高】(18)---静态内部类和非静态内部类
java提高](18)-静态内部类和非静态内部类 定义 放在一个类的内部的类我们就叫内部类. 自己从开发到现在其实用到内部类主要在两个地方会考虑用内部类: 1.使用静态内部类的单例模式 2.将Json ...
- EF获取DataTable的扩展方法GetDataSet
微软的EF至今已到了EF6版本了,但是,不知道微软咋想的,至今也不支持直接从数据库获取一张数据表DataTable,但这个DataTable在许多情况下还是比确定的实体化类更方便好使,这里,我仿照微软 ...
- 关于js-xlsx的使用
写在前头,本人是名Java开发人员,偶尔在前端打打酱油,写出的代码或许存在问题,请路过的大神一一指正,不吝感激. 最近公司准备做一些关于Excel 数据导入和导出相关需求,之前有在开源社区看到说比起纯 ...
- SpringBoot与Shiro整合权限管理实战
SpringBoot与Shiro整合权限管理实战 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] *观看本文章需要有一定SpringBoot整合经验* Shiro框架简介 Apach ...
- cocos creator 事件
cocos creator 事件 在做一个消除类游戏时,需要对点击的方块做出响应.代码很简单,可背后的原理还多着呢. 1. 普通节点注册click事件 在cc中如果需要相应click事件,需要为该节点 ...