-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path0987.二叉树的垂序遍历.java
138 lines (128 loc) · 3.89 KB
/
0987.二叉树的垂序遍历.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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*
* @lc app=leetcode.cn id=987 lang=java
*
* [987] 二叉树的垂序遍历
*
* https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/description/
*
* algorithms
* Hard (53.91%)
* Likes: 258
* Dislikes: 0
* Total Accepted: 34.8K
* Total Submissions: 64K
* Testcase Example: '[3,9,20,null,null,15,7]'
*
* 给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。
*
* 对位于 (row, col) 的每个结点而言,其左右子结点分别位于 (row + 1, col - 1) 和 (row + 1, col + 1)
* 。树的根结点位于 (0, 0) 。
*
* 二叉树的 垂序遍历
* 从最左边的列开始直到最右边的列结束,按列索引每一列上的所有结点,形成一个按出现位置从上到下排序的有序列表。如果同行同列上有多个结点,则按结点的值从小到大进行排序。
*
* 返回二叉树的 垂序遍历 序列。
*
*
*
* 示例 1:
*
*
* 输入:root = [3,9,20,null,null,15,7]
* 输出:[[9],[3,15],[20],[7]]
* 解释:
* 列 -1 :只有结点 9 在此列中。
* 列 0 :只有结点 3 和 15 在此列中,按从上到下顺序。
* 列 1 :只有结点 20 在此列中。
* 列 2 :只有结点 7 在此列中。
*
* 示例 2:
*
*
* 输入:root = [1,2,3,4,5,6,7]
* 输出:[[4],[2],[1,5,6],[3],[7]]
* 解释:
* 列 -2 :只有结点 4 在此列中。
* 列 -1 :只有结点 2 在此列中。
* 列 0 :结点 1 、5 和 6 都在此列中。
* 1 在上面,所以它出现在前面。
* 5 和 6 位置都是 (2, 0) ,所以按值从小到大排序,5 在 6 的前面。
* 列 1 :只有结点 3 在此列中。
* 列 2 :只有结点 7 在此列中。
*
*
* 示例 3:
*
*
* 输入:root = [1,2,3,4,6,5,7]
* 输出:[[4],[2],[1,5,6],[3],[7]]
* 解释:
* 这个示例实际上与示例 2 完全相同,只是结点 5 和 6 在树中的位置发生了交换。
* 因为 5 和 6 的位置仍然相同,所以答案保持不变,仍然按值从小到大排序。
*
*
*
* 提示:
*
*
* 树中结点数目总数在范围 [1, 1000] 内
* 0
*
*
*/
// @lc code=start
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 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>> verticalTraversal(TreeNode root) {
List<int[]> nodes = new ArrayList<int[]>();
dfs(root, 0, 0, nodes);
Collections.sort(nodes, new Comparator<int[]>() {
public int compare(int[] tuple1, int[] tuple2) {
if (tuple1[0] != tuple2[0])
return tuple1[0] - tuple2[0];
else if (tuple1[1] != tuple2[1])
return tuple1[1] - tuple2[1];
else
return tuple1[2] - tuple2[2];
}
});
List<List<Integer>> result = new ArrayList<List<Integer>>();
int size = 0, lastCol = Integer.MIN_VALUE;
for (int[] tuple : nodes) {
int col = tuple[0], row = tuple[1], value = tuple[2];
if (col != lastCol) {
lastCol = col;
result.add(new ArrayList<Integer>());
size++;
}
result.get(size - 1).add(value);
}
return result;
}
private void dfs(TreeNode node, int row, int col, List<int[]> nodes) {
if (node == null)
return;
nodes.add(new int[] { col, row, node.val });
dfs(node.left, row + 1, col - 1, nodes);
dfs(node.right, row + 1, col + 1, nodes);
}
}
// @lc code=end