二叉树的垂直遍历
难度:
标签:
题目描述
代码结果
运行时间: 23 ms, 内存: 16.1 MB
// Leetcode Problem: Vertical Order Traversal of a Binary Tree
// Using Java Stream API to solve the problem with detailed comments.
import java.util.*;
import java.util.stream.*;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
class Solution {
public List<List<Integer>> verticalTraversal(TreeNode root) {
TreeMap<Integer, TreeMap<Integer, PriorityQueue<Integer>>> map = new TreeMap<>();
traverse(root, 0, 0, map);
return map.values().stream()
.map(m -> m.values().stream()
.flatMap(PriorityQueue::stream)
.collect(Collectors.toList()))
.collect(Collectors.toList());
}
private void traverse(TreeNode node, int x, int y, TreeMap<Integer, TreeMap<Integer, PriorityQueue<Integer>>> map) {
if (node == null) return;
map.putIfAbsent(x, new TreeMap<>());
map.get(x).putIfAbsent(y, new PriorityQueue<>());
map.get(x).get(y).add(node.val);
traverse(node.left, x - 1, y + 1, map);
traverse(node.right, x + 1, y + 1, map);
}
}
解释
方法:
这个题解使用了BFS的思路来遍历二叉树,并用一个哈希表pos来记录每个节点的横坐标和对应的节点值。具体步骤如下:
1. 如果根节点为空,直接返回空列表。
2. 初始化一个双端队列stack,并将根节点和其横坐标0作为元组放入队列。
3. 当队列不为空时,循环执行以下操作:
- 从队列左端取出一个节点p和其横坐标index。
- 将节点p的值加入哈希表pos中,键为index,值为一个列表,存储所有横坐标为index的节点值。
- 如果p的左子节点存在,将其与横坐标index-1作为元组放入队列。
- 如果p的右子节点存在,将其与横坐标index+1作为元组放入队列。
4. 遍历完成后,将哈希表pos的所有键(即横坐标)排序。
5. 按照排序后的横坐标顺序,将对应的节点值列表依次加入结果列表res中。
6. 返回结果列表res。
时间复杂度:
O(n + klogk),最坏情况下为O(nlogn)
空间复杂度:
O(n)
代码细节讲解
🦆
在二叉树的垂直遍历中,为何选择广度优先搜索(BFS)而不是深度优先搜索(DFS)?
▷🦆
哈希表中键为横坐标时,如果两个节点具有相同的横坐标但不同的深度,它们的处理方式有何不同?
▷🦆
在广度优先搜索遍历时,如何处理节点值的存储以确保它们按照从上到下的顺序出现?
▷🦆
代码中对pos使用了defaultdict(list),这种数据结构带来的好处是什么?
▷