forked from szl0072/Leetcode-Solution-Code
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBinaryTreeVerticalOrderTraversal.java
107 lines (92 loc) · 2.36 KB
/
BinaryTreeVerticalOrderTraversal.java
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
102
103
104
105
106
107
package leetcode;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* Project Name : Leetcode
* Package Name : leetcode
* File Name : BinaryTreeVerticalOrderTraversal
* Creator : Edward
* Date : Jan, 2018
* Description : 314. Binary Tree Vertical Order Traversal
*/
public class BinaryTreeVerticalOrderTraversal {
/**
*Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bottom, column by column).
If two nodes are in the same row and column, the order should be from left to right.
Examples:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
|
. _ * _ * _ 0 _ . _ *
-2 -1 0 1 2 3
return its vertical order traversal as:
[
[9],
[3,15],
[20],
[7]
]
Given binary tree [3,9,8,4,0,1,7],
3
/ \
9 8
/ \ / \
4 0 1 7
-2 0 2
return its vertical order traversal as:
[
[4],
[9],
[3,0,1],
[8],
[7]
]
1, dfs max min
2, bfs
time : O(n)
space : O(n)
*/
private int min = 0;
private int max = 0;
public List<List<Integer>> verticalOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) {
return res;
}
helper(root, 0);
for (int i = min; i <= max; i++) {
res.add(new ArrayList<>());
}
Queue<TreeNode> queue = new LinkedList<>();
Queue<Integer> index = new LinkedList<>();
index.offer(-min);
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode cur = queue.poll();
int idx = index.poll();
res.get(idx).add(cur.val);
if (cur.left != null) {
queue.offer(cur.left);
index.offer(idx - 1);
}
if (cur.right != null) {
queue.offer(cur.right);
index.offer(idx + 1);
}
}
return res;
}
private void helper(TreeNode root, int idx) {
if (root == null) return;
min = Math.min(min, idx);
max = Math.max(max, idx);
helper(root.left, idx - 1);
helper(root.right, idx + 1);
}
}