987. 二叉树的垂序遍历
987. 二叉树的垂序遍历
题目

题解
- 首先,先采用层序遍历的方式,遍历整个树节点。在遍历的过程中,计算好每个节点的行、列下标。
- 维护一个
Map<Integer /*列号*/, List<int[] /*{行号,值}*/> /*每列的值列表*/> map - 遍历到每一个节点时,将这个节点添加到map中对应的列里,以
new int[]{行号, 值}的形式 - 遍历结束后,将map按照key从大到小的顺序进行遍历,对map中每一个value列表,进行排序
- 如果行号不同,则行号小的排在前面
- 如果行号相同,则值小的排在前面
class Solution {
public List<List<Integer>> verticalTraversal(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
Map<Integer /*列*/, List<int[]> /* 行, val */> map = new HashMap<>();
Deque<MyTreeNode> queue = new ArrayDeque<>();
queue.offer(new MyTreeNode(root, 0, 0));
while (!queue.isEmpty()) {
MyTreeNode curr = queue.poll();
/*
将当前节点添加到对应列的列表中,格式为
[行号, 当前节点值]
*/
map.computeIfAbsent(curr.col, k -> new ArrayList<>())
.add(new int[]{curr.row, curr.treeNode.val});
if (curr.treeNode.right != null) {
queue.offer(new MyTreeNode(curr.treeNode.right, curr.row + 1, curr.col + 1));
}
if (curr.treeNode.left != null) {
queue.offer(new MyTreeNode(curr.treeNode.left, curr.row + 1, curr.col - 1));
}
}
int minCol = 0;
int maxCol = 0;
for (Integer col : map.keySet()) {
minCol = Math.min(minCol, col);
maxCol = Math.max(maxCol, col);
}
List<List<Integer>> result = new ArrayList<>();
for (int i = minCol; i <= maxCol; i++) {
List<int[]> list = map.get(i);
list.sort((node1, node2) -> { // 自定义比较器,进行值的比较
if (node1[0] != node2[0]) {
// 不同行号,行号小的排在前面
return node1[0] - node2[0];
} else {
// 同行号,值小的排在前面
return node1[1] - node2[1];
}
});
List<Integer> values = new ArrayList<>();
for (int[] node : list) {
values.add(node[1]);
}
result.add(values);
}
return result;
}
class MyTreeNode {
TreeNode treeNode;
int row;
int col;
public MyTreeNode(TreeNode treeNode, int row, int col) {
this.treeNode = treeNode;
this.row = row;
this.col = col;
}
}
}

浙公网安备 33010602011771号