【题目】请实现一个函数按照之字形打印二叉树,
* 即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,
* 其他行以此类推。

未优化,不是最优解,博主用的是队列,我用的栈。

方法一:直接打印

  1. package com.exe7.offer;
  2.  
  3. import java.util.Stack;
  4.  
  5. import org.junit.Test;
  6.  
  7. /**方法一:直接打印
  8. * 【题目】请实现一个函数按照之字形打印二叉树,
  9. * 即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,
  10. * 其他行以此类推。
  11. * @author WGS
  12. *
  13. */
  14. public class PrintBiTree {
  15. static class TreeNode{
  16. int val=0;
  17. TreeNode left=null;
  18. TreeNode right=null;
  19. public TreeNode(int val){
  20. this.val=val;
  21. }
  22. }
  23.  
  24. public void printZhiTree(TreeNode pRoot){
  25. if(pRoot==null) return;
  26. Stack<TreeNode> stack1=new Stack<>();
  27. Stack<TreeNode> stack2=new Stack<>();
  28. stack1.push(pRoot);
  29. int toBePrint=1;
  30. int nextLevelNodes=0;
  31. int level=1;
  32. TreeNode tempNode=null;
  33.  
  34. while(!stack1.isEmpty() || !stack2.isEmpty()){
  35. if(level%2!=0){
  36. tempNode=stack1.pop();
  37. System.out.print(tempNode.val+" ");
  38. --toBePrint;
  39. if(tempNode.left!=null){
  40. stack2.push(tempNode.left);
  41. ++nextLevelNodes;
  42. }
  43. if(tempNode.right!=null){
  44. stack2.push(tempNode.right);
  45. ++nextLevelNodes;
  46. }
  47. }else{
  48. tempNode=stack2.pop();
  49. System.out.print(tempNode.val+" ");
  50. --toBePrint;
  51.  
  52. if(tempNode.right!=null){
  53. stack1.push(tempNode.right);
  54. ++nextLevelNodes;
  55. }
  56. if(tempNode.left!=null){
  57. stack1.push(tempNode.left);
  58. ++nextLevelNodes;
  59. }
  60. }
  61. //
  62. if(toBePrint==0){
  63. System.out.println("------------------");
  64. level++;
  65. toBePrint=nextLevelNodes;
  66. nextLevelNodes=0;
  67. }
  68. }
  69.  
  70. }
  71.  
  72. //测试类
  73. public static void main(String[] args){
  74. PrintBiTree p=new PrintBiTree();
  75. TreeNode root = new TreeNode(8);
  76. TreeNode node1 = new TreeNode(6);
  77. TreeNode node2 = new TreeNode(10);
  78. TreeNode node3 = new TreeNode(5);
  79. TreeNode node4 = new TreeNode(7);
  80. TreeNode node5 = new TreeNode(9);
  81. TreeNode node6 = new TreeNode(11);
  82. TreeNode node7 = new TreeNode(12);
  83. TreeNode node8 = new TreeNode(13);
  84. TreeNode node9 = new TreeNode(14);
  85. TreeNode node10 = new TreeNode(15);
  86. TreeNode node11 = new TreeNode(16);
  87. TreeNode node12 = new TreeNode(17);
  88. TreeNode node13 = new TreeNode(18);
  89. TreeNode node14 = new TreeNode(19);
  90.  
  91. root.left = node1;
  92. root.right = node2;
  93. node1.left = node3;
  94. node1.right = node4;
  95. node2.left = node5;
  96. node2.right = node6;
  97. node3.left=node7;
  98. node3.right=node8;
  99. node4.left=node9;
  100. node4.right=node10;
  101. node5.left=node11;
  102. node5.right=node12;
  103. node6.left=node13;
  104. node6.right=node14;
  105.  
  106. p.printZhiTree(root);
  107. }
  108.  
  109. }

方法二:面试需要

  1. package com.exe7.offer;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Stack;
  5.  
  6. /**方法二:面试时候需要
  7. * 【题目】请实现一个函数按照之字形打印二叉树,
  8. * 即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,
  9. * 其他行以此类推。
  10. * @author WGS
  11. *
  12. */
  13. public class PrintBiTree2 {
  14. static class TreeNode{
  15. int val=0;
  16. TreeNode left=null;
  17. TreeNode right=null;
  18. public TreeNode(int val){
  19. this.val=val;
  20. }
  21. }
  22.  
  23. public ArrayList<ArrayList<Integer>> printZhiTree(TreeNode pRoot){
  24. ArrayList<ArrayList<Integer>> list=new ArrayList<>();
  25. if(pRoot==null) return list;
  26. ArrayList<Integer> nodeList=new ArrayList<Integer>();
  27. Stack<TreeNode> stack1=new Stack<>();
  28. Stack<TreeNode> stack2=new Stack<>();
  29. stack1.push(pRoot);
  30. int toBePrint=1;
  31. int nextLevelNodes=0;
  32. int level=1;
  33. TreeNode tempNode=null;
  34.  
  35. while(!stack1.isEmpty() || !stack2.isEmpty()){
  36. if(level%2!=0){//奇数层
  37. tempNode=stack1.pop();
  38. //System.out.print(tempNode.val+" ");
  39. nodeList.add(tempNode.val);
  40. --toBePrint;
  41. if(tempNode.left!=null){
  42. stack2.push(tempNode.left);
  43. ++nextLevelNodes;
  44. }
  45. if(tempNode.right!=null){
  46. stack2.push(tempNode.right);
  47. ++nextLevelNodes;
  48. }
  49.  
  50. }else{
  51. tempNode=stack2.pop();
  52. //System.out.print(tempNode.val+" ");
  53. nodeList.add(tempNode.val);
  54. --toBePrint;
  55.  
  56. if(tempNode.right!=null){
  57. stack1.push(tempNode.right);
  58. ++nextLevelNodes;
  59. }
  60. if(tempNode.left!=null){
  61. stack1.push(tempNode.left);
  62. ++nextLevelNodes;
  63. }
  64. /* if(toBePrint==0){
  65. System.out.println();
  66. list.add(nodeList);
  67. level++;
  68. toBePrint=nextLevelNodes;
  69. nextLevelNodes=0;
  70. nodeList=new ArrayList<Integer>();
  71. }*/
  72. }
  73. if(toBePrint==0){
  74. System.out.println();
  75. list.add(nodeList);
  76. level++;
  77. toBePrint=nextLevelNodes;
  78. nextLevelNodes=0;
  79. nodeList=new ArrayList<Integer>();
  80. }
  81. }
  82. return list;
  83.  
  84. }
  85.  
  86. //测试类
  87. public static void main(String[] args){
  88. PrintBiTree2 p=new PrintBiTree2();
  89. TreeNode root = new TreeNode(8);
  90. TreeNode node1 = new TreeNode(6);
  91. TreeNode node2 = new TreeNode(10);
  92. TreeNode node3 = new TreeNode(5);
  93. TreeNode node4 = new TreeNode(7);
  94. TreeNode node5 = new TreeNode(9);
  95. TreeNode node6 = new TreeNode(11);
  96. TreeNode node7 = new TreeNode(12);
  97. TreeNode node8 = new TreeNode(13);
  98. TreeNode node9 = new TreeNode(14);
  99. TreeNode node10 = new TreeNode(15);
  100. TreeNode node11 = new TreeNode(16);
  101. TreeNode node12 = new TreeNode(17);
  102. TreeNode node13 = new TreeNode(18);
  103. TreeNode node14 = new TreeNode(19);
  104.  
  105. root.left = node1;
  106. root.right = node2;
  107. node1.left = node3;
  108. node1.right = node4;
  109. node2.left = node5;
  110. node2.right = node6;
  111. node3.left=node7;
  112. node3.right=node8;
  113. node4.left=node9;
  114. node4.right=node10;
  115. node5.left=node11;
  116. node5.right=node12;
  117. node6.left=node13;
  118. node6.right=node14;
  119.  
  120. ArrayList<ArrayList<Integer>> getList=p.printZhiTree(root);;
  121. for(ArrayList<Integer> a:getList){
  122. System.out.println(a);
  123. }
  124.  
  125. }
  126.  
  127. }

剑指offer系列34----按之字形顺序打印二叉树的更多相关文章

  1. 剑指offer 面试题. 按之字形顺序打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推.   方法1: 正常层次遍历,利用普通队列.逢 ...

  2. 剑指 Offer 32 - III. 从上到下打印二叉树 III + 双端队列使用 + 蛇形打印层次遍历序列 + 正倒序输出

    剑指 Offer 32 - III. 从上到下打印二叉树 III Offer_32_3 题目详情 题解分析 本题我想的比较复杂,其实题目的要求只是需要遍历的结果逆序和正序交替,这个其实可以使用Coll ...

  3. 剑指 Offer 32 - III. 从上到下打印二叉树 III

    剑指 Offer 32 - III. 从上到下打印二叉树 III 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印, ...

  4. 剑指 Offer 32 - II. 从上到下打印二叉树 II + 层次遍历二叉树 + 按层存储

    剑指 Offer 32 - II. 从上到下打印二叉树 II Offer_32 题目描述: 题解分析: 这道题我一开始想到的解决方法较粗暴,就是使用两个变量来记录当前层的节点数和下一层的结点数. 以上 ...

  5. 剑指 Offer 32 - I. 从上到下打印二叉树 + 层次遍历二叉树

    剑指 Offer 32 - I. 从上到下打印二叉树 Offer_32_1 题目描述 解题思路 这题属于简单题,考察的是我们对二叉树以及层次遍历的方法. 这里只需要使用简单的队列即可完成二叉树的层次遍 ...

  6. 剑指 Offer 32 - II. 从上到下打印二叉树 II

    剑指 Offer 32 - II. 从上到下打印二叉树 II 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,1 ...

  7. 剑指 Offer 32 - I. 从上到下打印二叉树

    剑指 Offer 32 - I. 从上到下打印二叉树 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 ...

  8. 每日一题 - 剑指 Offer 32 - III. 从上到下打印二叉树 III

    题目信息 时间: 2019-06-25 题目链接:Leetcode tag:双端队列 难易程度:中等 题目描述: 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右 ...

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

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路 按照从左往右从上到下的顺序打印节点,需要我们维护一个队列,这个队列放入元素的顺序是访问队头节点(起始先放入根节点),则若当前 ...

  10. 剑指offer——33分行从上到下打印二叉树

    题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行.   题解: 使用BFS,按层打印即可 class Solution { public: vector<vector&l ...

随机推荐

  1. dedecms 列表页调用自定义字段

    在列表附加字段中添加自己定义的字段 如: lwulr调用:{dede:list addfields="lwurl" channelid="1"}[field:l ...

  2. sk_buff 结构分析

    sk_buff分析 sk_buff是Linux网络代码中最重要的结构体之一.它是Linux在其协议栈里传送的结构体,也就是所谓的“包”,在他里面包含了各层协议的头部,比如ethernet, ip ,t ...

  3. 八 JDBC

    一 JDBC 简介 1. 作用:规避数据库的不同,为程序开发人员访问数据库提供统一的编程接口. 2. 具体作用:和数据库建立连接,发送 sql 语句,处理数据库返回的结果集. 3. 框架模式: 4. ...

  4. centos 主从复制

    1.主服务器rpm安装mysql 2.复制一台服务器叫slave(从服务器),一会儿要用 3.在主服务器,修改my.cnf文件 找到server-id,在它的下面加上 binlog-do-db = h ...

  5. puppet安装配置及使用

     puppet安装前准备 一.服务器信息 master端:10.10.10.201 master.fansik.com slave端:10.10.10.156 slave.fansik.com 三台机 ...

  6. LAMT基于mod_proxy方式的负载均衡集群

    一.apache服务器 # httpd -D DUMP_MODULES | grep  proxy查看是否有 proxy_balancer_module (shared)模块 二.编辑配置文件 1.编 ...

  7. linux笔记_磁盘分区

    一.分区的意义 1.不同操作系统往往不可以同时装载在同一个分区,分区解决了不同操作系统装载在同一个物理硬盘的兼容性问题 2.机械硬盘盘片外圈读写速度相对内圈要快,分区可以把常用数据限制在读写速度较快的 ...

  8. spark中streamingContext的使用详解

    两种创建方式 val conf = new SparkConf().setAppName(appName).setMaster(master);val ssc = new StreamingConte ...

  9. scala言语基础学习三(面向对象编程)

    定义一个简单的类 //定义类,包含field以及方法 自定义的getter 和setter 仅仅暴露field的getter和setter方法 private[this]的使用 (只能在当前实例中使用 ...

  10. JAVA导入包

    在package **;下面写入 import java.**.**; 1.使用Scanner工具类来获取用户输入的成绩信息 Scanner类位于java.util包中,使用时需要导入此包 1.1. ...