59 按之字形顺序打印二叉树

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

思路
1.使用两个栈来分别存储奇数层节点和偶数层节点。 
2.注意两个栈的插入顺序是不同的。 
3.对于奇数层来说,也就是从左往右的顺序,先添加左子树,然后添加右子树。对于偶数层,刚好相反,先添加右子树,然后添加左子树。

 

 1 /*
 2 public class TreeNode {
 3     int val = 0;
 4     TreeNode left = null;
 5     TreeNode right = null;
 6     public TreeNode(int val) {
 7         this.val = val;
 8     }
 9 }
10 */
11 import java.util.Stack;
12 import java.util.ArrayList;
13 public class Solution {
14     public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
15         //list变量,中间每次加进ArrayList<Integer>的temp变量
16         ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
17         //考虑最特殊情况
18         if (pRoot == null)
19             return list;
20         int level = 1;
21         //s1存奇数层节点,默认根为第1层
22         Stack<TreeNode> s1 = new Stack<TreeNode>();
23         s1.push(pRoot);
24         //s2存偶数层节点
25         Stack<TreeNode> s2 = new Stack<TreeNode>();
26 
27         //因为s1放奇数层节点,s2放偶数层节点,所以当两个堆栈都为空就停止了循环
28         //都为空的对立面是 不都为空
29         while (!s1.empty() || !s2.empty()) {
30             if (level%2 != 0) {//奇数层的操作
31                 ArrayList<Integer> temp = new ArrayList<Integer>();
32                 while (!s1.isEmpty()) {//23行代码保证了堆栈上来不可能为空,只要非空,执行while
33                     TreeNode node = s1.pop();
34                     if(node != null) {
35                         temp.add(node.val);
36                         s2.push(node.left);  //给另一方的堆栈入栈
37                         s2.push(node.right);
38                     }
39                 }
40                 if (!temp.isEmpty()) {   //判断temp是否为空
41                     list.add(temp);
42                     level++;
43                     }
44             } else {//偶数层的操作
45                     ArrayList<Integer> temp = new ArrayList<Integer>();
46                     while (!s2.isEmpty()) {
47                         TreeNode node = s2.pop();
48                         if(node != null) {
49                             temp.add(node.val);
50                             s1.push(node.right);  //给另一方的堆栈入栈
51                             s1.push(node.left);
52                         }
53                     }
54                     if (!temp.isEmpty()){    //判断temp是否为空
55                         list.add(temp);
56                         level++;
57                     }
58                 }
59             }
60         return list;//返回结果即可
61     }
62 }

 

posted @ 2019-07-11 11:02  淡如水94  阅读(126)  评论(0编辑  收藏  举报