二叉搜索树染色
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 345 ms, 内存: 67.8 MB
/*
思路:
1. 使用 Java Stream API 对中序遍历进行处理,获取所有节点值。
2. 创建一个 Map 记录每个节点的颜色状态,初始化为蓝色。
3. 使用 Stream 处理每个操作,更新相应范围内节点的颜色。
4. 最后统计红色节点的数量。
*/
import java.util.*;
import java.util.stream.Collectors;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class BSTColoringStream {
public int getRedNodesCount(TreeNode root, int[][] ops) {
List<Integer> nodes = new ArrayList<>();
Map<Integer, Boolean> colorMap = new HashMap<>();
inOrder(root, nodes);
nodes.forEach(val -> colorMap.put(val, false)); // Initially all nodes are blue
Arrays.stream(ops).forEach(op ->
nodes.stream()
.filter(val -> val >= op[1] && val <= op[2])
.forEach(val -> colorMap.put(val, op[0] == 1))
);
long redCount = colorMap.values().stream().filter(isRed -> isRed).count();
return (int) redCount;
}
private void inOrder(TreeNode node, List<Integer> nodes) {
if (node == null) return;
inOrder(node.left, nodes);
nodes.add(node.val);
inOrder(node.right, nodes);
}
}
解释
方法:
此题解通过首先将二叉搜索树的所有节点值收集到一个列表中,然后逆序遍历给定的操作列表。对于每个操作,它使用二分搜索确定操作影响的值范围在列表中的位置,然后根据操作类型更新红色节点的计数器。操作完成后,对列表进行切片以删除已处理的值范围。该方法利用了二叉搜索树的有序性和二分搜索来有效处理节点范围。
时间复杂度:
O(m log n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么题解中选择使用逆序遍历操作列表 `ops[::-1]` 而不是正序遍历?
▷🦆
在操作列表逆序遍历后,直接移除已处理的值范围 `values = values[:i] + values[j:]` 是否会影响后续操作的正确性?
▷🦆
题解中提到使用深度优先搜索(DFS)来收集所有节点值,这样收集的节点值是否一定是有序的,为什么?
▷