-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathBinaryTreeZigZagLevelOrderTraversal.java
More file actions
101 lines (93 loc) · 2.88 KB
/
BinaryTreeZigZagLevelOrderTraversal.java
File metadata and controls
101 lines (93 loc) · 2.88 KB
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/**
* @author eko
* @date 2018/10/19 11:21 AM
*
* Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
*
* For example:
* Given binary tree [3,9,20,null,null,15,7],
* 3
* / \
* 9 20
* / \
* 15 7
* return its zigzag level order traversal as:
* [
* [3],
* [20,9],
* [15,7]
* ]
*
*/
package leetcode;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class BinaryTreeZigZagLevelOrderTraversal {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public static void main(String[] args) {
BinaryTreeZigZagLevelOrderTraversal solution = new BinaryTreeZigZagLevelOrderTraversal();
TreeNode node = solution.new TreeNode(1);
node.left = solution.new TreeNode(2);
node.right = solution.new TreeNode(4);
node.left.left = solution.new TreeNode(3);
node.right.right = solution.new TreeNode(5);
List<List<Integer>> res = solution.zigzagLevelOrder(node);
System.out.println(res);
}
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if (root == null) return new ArrayList<>();
List<List<Integer>> result = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
boolean flag = true;
while (!stack.isEmpty()) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> newStack = new Stack<>();
while (!stack.empty()) {
TreeNode node = stack.pop();
list.add(node.val);
if (flag) {
if (node.left != null) newStack.push(node.left);
if (node.right != null) newStack.push(node.right);
} else {
if (node.right != null) newStack.push(node.right);
if (node.left != null) newStack.push(node.left);
}
}
stack = newStack;
flag = !flag;
result.add(list);
}
return result;
}
}
/**
* Better Solution from Others
*
* class Solution {
* public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
* List<List<Integer>> res = new ArrayList<>();
*
* traverse(root, 1, res);
*
* return res;
* }
*
* private void traverse(TreeNode node, int lvl, List<List<Integer>> res) {
* if(node == null) return;
* if(res.size() < lvl) res.add(new LinkedList<Integer>());
* LinkedList l = (LinkedList)res.get(lvl-1);
* if(lvl % 2 == 0) l.offerFirst(node.val);
* else l.offerLast(node.val);
*
* traverse(node.left, lvl+1, res);
* traverse(node.right, lvl+1, res);
* }
* }
*/