1530. Number of Good Leaf Nodes Pairs

139 阅读1分钟

image.png

思路

两个叶子节点之间的最短路径长度 >= 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;
    }
}