剑指offer第五十九题。

题目描述

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

解题思路

思路是搞两个栈,一个栈专门保存奇数层数据,一个栈专门保存偶数层数据。注意保存的顺序,保存偶数层的时候是从左到右,保存奇数层的时候从右到左。这样依次出栈的时候顺序是第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,依次类推。

我的答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class Solution {
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > res = new ArrayList<>();
if(pRoot == null){
return res;
}
int layer = 1;
//存放奇数层
Stack<TreeNode> stack1 = new Stack<>();
stack1.push(pRoot);
//存放偶数层
Stack<TreeNode> stack2 = new Stack<>();

while(!stack1.isEmpty() || !stack2.isEmpty()){
if(layer%2 != 0){
//说明是奇数层
ArrayList<Integer> list = new ArrayList<>();
while(!stack1.isEmpty()){
TreeNode tmp = stack1.pop();
if(tmp != null){
list.add(tmp.val);
stack2.push(tmp.left);
stack2.push(tmp.right);
}
}
if(list.size() != 0){
res.add(list);
layer++;
}
}else{
//说明是偶数层
ArrayList<Integer> list = new ArrayList<>();
while(!stack2.isEmpty()){
TreeNode tmp = stack2.pop();
if(tmp != null){
list.add(tmp.val);
stack1.push(tmp.right);
stack1.push(tmp.left);
}
}
if(list.size() != 0){
res.add(list);
layer++;
}
}

}
return res;
}

}