思路
两个叶子节点之间的最短路径长度 >= distance,找几对这样的叶子结点。
- DFS,对于每个节点,它递归地计算其左右子树中所有叶子节点到该节点的距离。
- 然后,遍历这些距离,检查所有可能的左右叶子节点对,如果它们的总距离小于或等于给定的
distance,则将这对叶子节点视为一个好叶子节点对,并增加pairs的计数。 - time Time = O(n × D²)
class Solution {
int res = 0;
public int countPairs(TreeNode root, int distance) {
dfs(root, distance);
return res;
}
// 计算从当前节点到其所有叶子节点的距离, 存在list里,并不在意顺序
public List<Integer> dfs(TreeNode node, int distance) {
List<Integer> list = new ArrayList<>();
if (node == null) {
return list;
}
// 叶子结点 到 叶子结点 的距离 = 0
if (node.left == null && node.right == null) {
list.add(0);
return list;
}
// 递归计算左右子树根节点到叶子节点距离
List<Integer> leftList = dfs(node.left, distance);
List<Integer> rightList = dfs(node.right, distance);
// 更新左子树叶子节点的距离,并将其添加到 distances
for (int d : leftList) {
if (d + 1 <= distance) { // 剪枝
list.add(d + 1);
}
}
// 更新右子树叶子节点的距离,并将其添加到 distances
for (int d : rightList) {
if (d + 1 <= distance) {
list.add(d + 1);
}
}
// 看看有没有能凑成 >= distance的距离
for (int l : leftList) {
for (int r : rightList) {
if (l + r + 2 <= distance) {
res++;
}
}
}
return list;
}
}