zoukankan      html  css  js  c++  java
  • 剑指offer系列34----按之字形顺序打印二叉树

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

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

    方法一:直接打印

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

    方法二:面试需要

      1 package com.exe7.offer;
      2 
      3 import java.util.ArrayList;
      4 import java.util.Stack;
      5 
      6 
      7 
      8 
      9 /**方法二:面试时候需要
     10  * 【题目】请实现一个函数按照之字形打印二叉树,
     11  *             即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,
     12  *        其他行以此类推。
     13  * @author WGS
     14  *
     15  */
     16 public class PrintBiTree2 {
     17     static class TreeNode{
     18         int val=0;
     19         TreeNode left=null;
     20         TreeNode right=null;
     21         public TreeNode(int val){
     22             this.val=val;
     23         }
     24     }
     25     
     26     
     27     public ArrayList<ArrayList<Integer>>  printZhiTree(TreeNode pRoot){
     28         ArrayList<ArrayList<Integer>> list=new ArrayList<>();
     29         if(pRoot==null) return list;
     30         ArrayList<Integer> nodeList=new ArrayList<Integer>();
     31         Stack<TreeNode> stack1=new Stack<>();
     32         Stack<TreeNode> stack2=new Stack<>();
     33         stack1.push(pRoot);
     34         int toBePrint=1;
     35         int nextLevelNodes=0;
     36         int level=1;
     37         TreeNode tempNode=null;
     38         
     39         while(!stack1.isEmpty() || !stack2.isEmpty()){
     40             if(level%2!=0){//奇数层
     41                 tempNode=stack1.pop();
     42                 //System.out.print(tempNode.val+" ");
     43                 nodeList.add(tempNode.val);
     44                 --toBePrint;
     45                 if(tempNode.left!=null){
     46                     stack2.push(tempNode.left);
     47                     ++nextLevelNodes;
     48                 }
     49                 if(tempNode.right!=null){
     50                     stack2.push(tempNode.right);
     51                     ++nextLevelNodes;
     52                 }
     53                 
     54             }else{
     55                 tempNode=stack2.pop();
     56                 //System.out.print(tempNode.val+" ");
     57                 nodeList.add(tempNode.val);
     58                 --toBePrint;
     59                 
     60                 if(tempNode.right!=null){
     61                     stack1.push(tempNode.right);
     62                     ++nextLevelNodes;
     63                 }
     64                 if(tempNode.left!=null){
     65                     stack1.push(tempNode.left);
     66                     ++nextLevelNodes;
     67                 }
     68             /*    if(toBePrint==0){
     69                     System.out.println();
     70                     list.add(nodeList);
     71                     level++;
     72                     toBePrint=nextLevelNodes;
     73                     nextLevelNodes=0;
     74                     nodeList=new ArrayList<Integer>();
     75                 }*/
     76             }
     77             if(toBePrint==0){
     78                 System.out.println();
     79                 list.add(nodeList);
     80                 level++;
     81                 toBePrint=nextLevelNodes;
     82                 nextLevelNodes=0;
     83                 nodeList=new ArrayList<Integer>();
     84             }
     85         }
     86         return list;
     87         
     88         
     89     }
     90     
     91     //测试类
     92         public static void main(String[] args){
     93             PrintBiTree2 p=new PrintBiTree2();
     94              TreeNode root = new TreeNode(8);
     95                 TreeNode node1 = new TreeNode(6);
     96                 TreeNode node2 = new TreeNode(10);
     97                 TreeNode node3 = new TreeNode(5);
     98                 TreeNode node4 = new TreeNode(7);
     99                 TreeNode node5 = new TreeNode(9);
    100                 TreeNode node6 = new TreeNode(11);
    101                 TreeNode node7 = new TreeNode(12);
    102                 TreeNode node8 = new TreeNode(13);
    103                 TreeNode node9 = new TreeNode(14);
    104                 TreeNode node10 = new TreeNode(15);
    105                 TreeNode node11 = new TreeNode(16);
    106                 TreeNode node12 = new TreeNode(17);
    107                 TreeNode node13 = new TreeNode(18);
    108                 TreeNode node14 = new TreeNode(19);
    109 
    110                 root.left = node1;
    111                 root.right = node2;
    112                 node1.left = node3;
    113                 node1.right = node4;
    114                 node2.left = node5;
    115                 node2.right = node6;
    116                 node3.left=node7;
    117                 node3.right=node8;
    118                 node4.left=node9;
    119                 node4.right=node10;
    120                 node5.left=node11;
    121                 node5.right=node12;
    122                 node6.left=node13;
    123                 node6.right=node14;
    124                 
    125                 ArrayList<ArrayList<Integer>> getList=p.printZhiTree(root);;
    126                 for(ArrayList<Integer> a:getList){
    127                     System.out.println(a);
    128                 }
    129                 
    130         }
    131 
    132     
    133     
    134     
    135     
    136 }
  • 相关阅读:
    【JavaScript】Object 实例属性
    【JavaScript】Object 构造函数和属性
    【JavaScript】Object 静态方法(三)
    PTA 乙级 1051 复数乘法 (15分) Python
    PTA 乙级 1050 螺旋矩阵 (25分) C++
    PTA 乙级 1049 数列的片段和 (20分) C/C++ (更新OJ导致测试点2无法通过,已解决)
    对象的深拷贝和浅拷贝和拷贝方法
    linux(腾讯云服务器)上安装mysql数据库
    SQLyog远程连接mysql数据库
    linux中搭建tomcat环境
  • 原文地址:https://www.cnblogs.com/noaman/p/5583774.html
Copyright © 2011-2022 走看看