码迷,mamicode.com
首页 > 其他好文 > 详细

按之字形顺序打印二叉树

时间:2017-08-22 01:51:33      阅读:347      评论:0      收藏:0      [点我收藏+]

标签:node   class   imp   count   二叉树   private   层遍历   alt   this   

 

http://blog.csdn.net/qq_27703417/article/details/70977347

 

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

 

第一行的时候,控制的是第二行的打印顺序,第二行的时候,控制的是第三行的打印顺序

奇数行从左到右压入栈,所以下一行按逆序打印

偶数行从右到左压入栈,所以下一行按正序打印

 

创建2个栈stack1和stack2,先将root结点压入到stack1中,然后开始循环过程:从stack1中弹出root,每次弹出一个结点时要判断它的左右子节点是否是null,如果不为null就压入到另一个栈stack2中,即这里弹出结点的栈和压入子节点的栈应该是分开的2个栈,从stack1中弹出的结点它的子节点要压入到另一个栈stack2中,当stack1中的结点弹光后,先判断stack2里面的元素是否为空,如果stack2中的结点数目也为0,那么说明在stack1弹出结点的时候没有再压入子节点到stack2中,说明此时已经没有下一层了,于是遍历结束,即遍历循环结束的判断条件是:stack1.isEmpty()并且stack2.isEmpty()。Stack1弹完后这一层就遍历结束了,它的下一层的结点都在stack2中了,为了便于循环中的操作,将stack2赋值给stack1,将stack2重新创建,这样就始终只要对stack1进行弹出,对stack2进行压入操作了,在循环代码中的实现较为简单。即基本操作过程就是从stack1中弹出结点,并将结点的子节点放入到另一个栈stack2中,当stack1遍历结束后就将stack2赋值给stack1,并将stack2重建,直到stack1和stack2都变空为止。需要注意的是:对于每一层,要求打印的顺序是不同的,对于奇数层,要求从左到右遍历结点,对于偶数层要求从右到左遍历结点,如何实现?对于偶数层,例如②③,在弹出时是先弹出③再弹出②,此时为了使得它的下一层能够从左到右输出,应该使得对于弹出的结点,先将其右孩子放入栈stack2,在将左孩子放入stack2,于是stack2中先后压入⑦⑥⑤④,弹出时的顺序就是④⑤⑥⑦;同理对于奇数层的结点,例如第三层,在遍历时的顺序是④⑤⑥⑦,它的下一层要求遍历顺序是15,14,13,12,11,⑩⑨⑧,于是在对④⑤⑥⑦的子节点压入栈是应该先压入左孩子再压入右孩子,于是先后向stack2中压入⑧⑨⑩11,12,13,14,15.总结来说,对于奇数层的结点在弹出时,它的孩子压入stack2的顺序应该是从左到右,即先压入左孩子再压入右孩子;对于偶数层的结点在弹出时,它的孩子压入stack2的顺序应该是从右到左,即先压入右孩子再压入左孩子。这种交替需要在循环体中写2中遍历子孩子的代码,并且记录一个层数计数器levelCount,通对其的奇偶性判断来决定使用哪一段代码即可。

 

  1. import java.util.*;  
  2. //之字形遍历:使用2个栈,遍历先压入左结点再压入右结点和先右结点再左结点交替进行;自动换行,不用last和nlast  
  3. public class Solution {  
  4.     //创建结果集,成员变量  
  5.     ArrayList<ArrayList<Integer>> results;  
  6.     public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {  
  7.         results=new ArrayList<ArrayList<Integer>>();  
  8.         //特殊输入  
  9.         if(pRoot==null) return results;  
  10.         //调用方法解决问题  
  11.         this.process(pRoot);  
  12.         //返回结果集  
  13.         return results;  
  14.     }  
  15.       
  16.     //该方法用来之字形遍历二叉树,并将每层结果放入到results中  
  17.     private void process(TreeNode root){  
  18.         //①创建辅助栈  
  19.         Stack<TreeNode> stack1=new Stack<>();  
  20.         Stack<TreeNode> stack2=new Stack<>();  
  21.         //每一层的结果集  
  22.         ArrayList<Integer> list=new ArrayList<>();  
  23.         //第一变量记录层数  
  24.         int levelCount=1;  
  25.         //②先将root压入栈  
  26.         stack1.push(root);  
  27.         //③循环:弹栈遍历--左右孩子入栈--交换stack1和stack2  
  28.         //只要stack1和stack2不全为空就可以继续  
  29.         while(!(stack1.isEmpty()&&stack2.isEmpty())){  
  30.             //弹出并遍历  
  31.             TreeNode temp=stack1.pop();  
  32.             list.add(temp.val);  
  33.             //左右孩子压入stack2中  
  34.             if(levelCount%2!=0){  
  35.                 //奇数层,先左再右  
  36.                 if(temp.left!=null){  
  37.                     stack2.push(temp.left);  
  38.                 }  
  39.                 if(temp.right!=null){  
  40.                     stack2.push(temp.right);  
  41.                 }  
  42.             }else{  
  43.                 //偶数层,先右再左  
  44.                 if(temp.right!=null){  
  45.                     stack2.push(temp.right);  
  46.                 }  
  47.                 if(temp.left!=null){  
  48.                     stack2.push(temp.left);  
  49.                 }  
  50.             }  
  51.               
  52.             //判断此时stack1是否为空,即本层是否遍历完成  
  53.             if(stack1.isEmpty()){  
  54.                 //本层遍历完成:换list,换stack1和stack2;层数加1  
  55.                 results.add(list);  
  56.                 list=new ArrayList<Integer>();  
  57.                 stack1=stack2;  
  58.                 stack2=new Stack<TreeNode>();  
  59.                 //千万记得层数+1  
  60.                 levelCount++;  
  61.             }  
  62.         }  
  63.     }  
  64. }  

 

按之字形顺序打印二叉树

标签:node   class   imp   count   二叉树   private   层遍历   alt   this   

原文地址:http://www.cnblogs.com/joshsung/p/7407303.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!