题目描述

  1. 不换行:从上到下打印出二叉树的每个节点,同层的节点按照从左到右的顺序打印。例如,输入下图的二叉树,则依次打印出8,6,10,5,7,9,11。

    牛客网刷题地址

  2. 要换行:从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行

    1. 8
    2. 6 10
    3. 5 7 9 11

    牛客网刷题地址

  3. 之字形:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。打印结果应为:

    1. 8
    2. 10 6
    3. 5 7 9 11

    牛客网刷题地址

二叉树节点的定义如下:  

思路分析

  其实就是二叉树的层次遍历,借助队列实现
  之字形打印:需要两个栈实现

测试用例

  1. 功能测试:完全二叉树;所有节点只有左子树的二叉树;所有节点只有右子树的二叉树。
  2. 特殊输入测试:二叉树根节点为nullptr 指针;只有一个节点的二叉树。

Java代码

  1. public class Offer32 {
  2. public static void main(String[] args) {
  3. test1();
  4. test2();
  5. test3();
  6. }
  7. public static List PrintFromTopToBottom(TreeNode root) {
  8. return Solution3(root);
  9. }
  10. private static ArrayList<Integer> Solution1(TreeNode root) {
  11. LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
  12. ArrayList<Integer> list = new ArrayList<Integer>();
  13. if(root==null){
  14. return list;
  15. }
  16. queue.offer(root);
  17. TreeNode node = null;
  18. while(queue.size()!=0){
  19. node = queue.poll();
  20. list.add(node.val);
  21. if(node.left!=null){
  22. queue.offer(node.left);
  23. }
  24. if(node.right!=null){
  25. queue.offer(node.right);
  26. }
  27. }
  28. return list;
  29. }
  30. private static ArrayList<ArrayList<Integer>> Solution2(TreeNode root) {
  31. ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
  32. ArrayList<Integer> levelList = null;
  33. if(root == null){
  34. return list;
  35. }
  36. LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
  37. queue.offer(root);
  38. int nextLevel= 1; //下层节点个数
  39. int toBePrinted = 0 ;//当前层还需要打印的节点个数
  40. TreeNode node =null;
  41. while(queue.size()!=0){
  42. toBePrinted = nextLevel;
  43. nextLevel = 0;
  44. levelList = new ArrayList<Integer>();
  45. for(int i=1;i<=toBePrinted;i++){
  46. node = queue.pop();
  47. levelList.add(node.val);
  48. if(node.left!=null){
  49. queue.offer(node.left);
  50. nextLevel ++ ;
  51. }
  52. if(node.right!=null){
  53. queue.offer(node.right);
  54. nextLevel ++ ;
  55. }
  56. }
  57. list.add(levelList);
  58. }
  59. return list;
  60. }
  61. private static ArrayList<ArrayList<Integer>> Solution3(TreeNode root) {
  62. ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
  63. ArrayList<Integer> levelList = null;
  64. if(root==null) {
  65. return list;
  66. }
  67. Stack<TreeNode> stack1 = new Stack<TreeNode>();
  68. Stack<TreeNode> stack2 = new Stack<TreeNode>();
  69. stack1.push(root);
  70. TreeNode node =null;
  71. while(!stack1.isEmpty() || !stack2.isEmpty()) {
  72. if(!stack1.isEmpty()) {
  73. levelList = new ArrayList<>();
  74. while(!stack1.isEmpty()) {
  75. node = stack1.pop();
  76. levelList.add(node.val);
  77. if(node.left!=null) {
  78. stack2.push(node.left);
  79. }
  80. if(node.right!=null) {
  81. stack2.push(node.right);
  82. }
  83. }
  84. list.add(levelList);
  85. }else {
  86. levelList = new ArrayList<>();
  87. while(!stack2.isEmpty()) {
  88. node = stack2.pop();
  89. levelList.add(node.val);
  90. if(node.right!=null) {
  91. stack1.push(node.right);
  92. }
  93. if(node.left!=null) {
  94. stack1.push(node.left);
  95. }
  96. }
  97. list.add(levelList);
  98. }
  99. }
  100. return list;
  101. }
  102. @SuppressWarnings("unused")
  103. private static void test1() {
  104. TreeNode root = new TreeNode(8);
  105. TreeNode node1 = new TreeNode(6);
  106. TreeNode node2 = new TreeNode(10);
  107. TreeNode node3 = new TreeNode(5);
  108. TreeNode node4 = new TreeNode(7);
  109. TreeNode node5 = new TreeNode(9);
  110. TreeNode node6 = new TreeNode(11);
  111. root.left=node1;
  112. root.right=node2;
  113. node1.left=node3;
  114. node1.right=node4;
  115. node2.left=node5;
  116. node2.right=node6;
  117. TreeNode.preOrder(root);
  118. System.out.println();
  119. ArrayList<ArrayList<Integer>> list = (ArrayList<ArrayList<Integer>>) PrintFromTopToBottom(root);
  120. // Solution3(root);
  121. System.out.println(list);
  122. }
  123. private static void test2() {
  124. }
  125. private static void test3() {
  126. }
  127. }

代码链接

剑指Offer代码-Java

【Offer】[32] 【从上到下打印二叉树】的更多相关文章

  1. 【Java】 剑指offer(32) 从上往下打印二叉树

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 (一)从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺 ...

  2. 剑指offer——32从上到下打印二叉树

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印.   题解: 就是简单的层序遍历 class Solution { public: vector<int> PrintFro ...

  3. 《剑指offer》从上往下打印二叉树

    本题来自<剑指offer> 从上往下打印二叉树 题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 队列的思想. 先将根节点加入,当取该节点时候,依次将左右子树加入,直 ...

  4. 【剑指Offer】从上往下打印二叉树 解题报告(Python)

    [剑指Offer]从上往下打印二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  5. 剑指Offer 22. 从上往下打印二叉树 (二叉树)

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 题目地址 https://www.nowcoder.com/practice/7fe2212963db4790b57431d9ed25 ...

  6. 剑指offer系列20--从上到下打印二叉树

    * 20 [题目]从上往下打印出二叉树的每个节点,同层节点从左至右打印. * [思路]从根结点开始,先保存结点,再看根结点的左右结点有没有值. * 有,就将左右值放到集合中: * 根节点输出后,打印根 ...

  7. 【剑指offer】从上向下打印二叉树

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26089165 剑指offer上的第23题,实际上就是考察二叉树的层序遍历,详细思想能够參考 ...

  8. Go语言实现:【剑指offer】从上往下打印二叉树

    该题目来源于牛客网<剑指offer>专题. 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 不需分层,一维数组. Go语言实现: /** * Definition for a bi ...

  9. 剑指OFFER之从上往下打印二叉树(九度OJ1523)

    题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, : ...

  10. 剑指offer:从上往下打印二叉树

    题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路: 实际就是二叉树的中序遍历问题.之前在leetcode刷过类似题目. 利用队列完成即可. 代码: /* struct Tr ...

随机推荐

  1. Linux : 性能监测相关命令

    [参考文章]:Linux命令大全 [参考文章]:Linux 运行进程实时监控pidstat命令详解 1. 进程级别的监测命令 1.1  top top命令可以实时动态地查看系统的整体运行情况,是一个综 ...

  2. Activiti6系列(3)- 快速体验

    一.部署启动activiti 1.部署,将两个war包拷贝到Tomcat下即可. 2.启动tomcat,访问http://127.0.0.1:8080/activiti-app 默认账号密码:admi ...

  3. ThreadLocal为什么会内存泄漏

    1.首先看下ThreadLocal的原理图: 在ThreadLocal的生命周期中,都存在这些引用. 其中,实线代表强引用,虚线代表弱引用: 2.ThreadLocal的实现:每个Thread维护一个 ...

  4. Go基础语法学习

    Go语言基础 Go是一门类似C的编译型语言,但是它的编译速度非常快.这门语言的关键字总共也就二十五个,比英文字母还少一个,这对于我们的学习来说就简单了很多.先让我们看一眼这些关键字都长什么样: 下面列 ...

  5. hadoop学习(六)----HDFS的shell操作

    HDFS所有命令: [uploaduser@rickiyang ~]$ hadoop fs Usage: hadoop fs [generic options] [-appendToFile < ...

  6. centOS 如何查看知道自己的版本号

    今天遇到一个尴尬的问题 , 竟然找不到centOS7x这个版本系统 然后我就问大佬们,大佬们1810 是哪哪哪个版本说的我还是懵逼 然后我就发挥我那不要脸的精神 问:'这是有什算发算的吗'  很是尴尬 ...

  7. CMake入门-02-HelloWorld扩展

    工作环境 系统:macOS Mojave 10.14.6 CMake: Version 3.15.0-rc4 Hello,World! 扩展-同一目录,多个源文件 (1) 新建 hello 目录,创建 ...

  8. Android lifecycle 使用详解

    版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/gdutxiaoxu/article/det ...

  9. 一个有趣的 5 X 5 方阵一笔画问题

      这个问题是在我上小学时同学告诉我的,当时觉得好玩,就随便瞎画这玩儿,不过从小学到大学,没有一次画成功过.这个问题起初同学告诉我的时候,图不是这样画的,我只是为了好表达,将问题抽象成网格了,原问题是 ...

  10. 你真的了JMeter解聚合报告么?

    1.背景 大家在使用JMeter进行性能测试时,聚合报告(Aggregate Report)可以说是必用的监听器,但是你真的了解聚合报告么? 2.目的 本次笔者跟大家聊聊聚合报告(Aggregate ...