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
| /**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> verticalOrder(TreeNode root) {
List<List<Pair<Integer, Integer>>> posList = new ArrayList<>();
List<List<Pair<Integer, Integer>>> negList = new ArrayList<>();
dfs(root, 0, 0, negList, posList);
return merge(negList, posList);
}
void dfs(TreeNode node, int row, int col,
List<List<Pair<Integer, Integer>>> negList,
List<List<Pair<Integer, Integer>>> posList
) {
if (node == null) return;
if (col >= 0) {
if (posList.size() == col) {
posList.add(new ArrayList<>());
}
posList.get(col).add(new Pair<>(node.val, row));
} else {
int posCol = -col - 1;
if (negList.size() == posCol) {
negList.add(new ArrayList<>());
}
negList.get(posCol).add(new Pair<>(node.val, row));
}
dfs(node.left, row + 1, col - 1, negList, posList);
dfs(node.right, row + 1, col + 1, negList, posList);
}
List<List<Integer>> merge(List<List<Pair<Integer, Integer>>> negList,
List<List<Pair<Integer, Integer>>> posList) {
List<List<Integer>> res = new ArrayList<>();
for (int i = negList.size() - 1; i >= 0; i--) {
negList.get(i).sort((a, b) -> a.getValue() - b.getValue());
res.add(negList.get(i).stream().map(a -> a.getKey()).collect(Collectors.toList()));
}
for (int i = 0; i < posList.size(); i++) {
posList.get(i).sort((a, b) -> a.getValue() - b.getValue());
res.add(posList.get(i).stream().map(a -> a.getKey()).collect(Collectors.toList()));
}
return res;
}
}
|