leetcode-binary-tree-zigzag

题目大意

  https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/

  “龙摆尾”式层次遍历二叉树

题目分析

  这种遍历方式需要在普通的层次遍历上加一些技巧,如下图:

https://ooo.0o0.ooo/2016/11/19/5830091dee5c0.png

  在访问完第一层以后,要自右向左地访问第二层,但到第三层以后又要自左向右地访问,这种反序的思路很容易想到用栈。要用到两个栈,第一个栈存TreeNode,第二个栈存所处的层数,因为奇数和偶数层下边逻辑会不一样。首先向栈中放入root节点,然后遍历整个栈,遍历部分伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
初始化辅助list,层list
while(栈不空) {
取栈顶元素
把它加入到这一层的list中
if(层数是奇数) { //root为第一层
先左后右,把栈顶元素的左右节点以此放入辅助list
} else {
先右后左,把栈顶元素的右左节点以此放入辅助list
}
}
层list加入到返回结果
然后遍历辅助list,将之一次入栈
结束本次循环

代码

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
52
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
if(root == null) {
return ans;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
Stack<Integer> layer = new Stack<Integer>();
stack.push(root);
layer.push(1);
while(!stack.empty()) {
List<Integer> tmpAns = new ArrayList<Integer>();
List<TreeNode> tmpStack = new ArrayList<TreeNode>();
int l = -1;
while(!stack.empty()) {
TreeNode top = stack.pop();
l = layer.pop();
tmpAns.add(top.val);
if (l % 2 == 1) {
if(top.left != null) {
tmpStack.add(top.left);
}
if(top.right != null) {
tmpStack.add(top.right);
}
} else {
if(top.right != null) {
tmpStack.add(top.right);
}
if(top.left != null) {
tmpStack.add(top.left);
}
}
}
ans.add(tmpAns);
for(TreeNode t : tmpStack) {
stack.push(t);
layer.push(l + 1);
}
}
return ans;
}
}

  算法复杂度是:O(树的节点数)