1530. 好叶子节点对的数量

104 阅读1分钟

题目:
给你二叉树的根节点 root 和一个整数 distance 。

如果二叉树中两个  节点之间的 最短路径长度 小于或者等于 distance ,那它们就可以构成一组 好叶子节点对 。

返回树中 好叶子节点对的数量 。
算法:
方法一:dfs
朴素的想法,选出left节点的所有叶子节点到node的距离,以及right节点的所有叶子节点到node的距离。 然后
1.把左叶子节点和右叶子节点的距离加起来,过滤掉超过distance的,保留小于等于distance的。向上返回。
2.计算左叶子节点和右叶子节点的距离之和,低于distance的有多少种组合,没存在一种组合ans++

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func countPairs(root *TreeNode, distance int) int {
    ans := 0
    // 返回node的左右叶子节点到node的distanse
    var dfs func(node *TreeNode, distance int) []int 
    dfs = func(node *TreeNode, distance int) []int {
        list := make([]int, 0)
        if node == nil {
            return nil
        }
        if node.Left == nil && node.Right == nil {
            return []int{0}
        }

        left := dfs(node.Left, distance)
        right := dfs(node.Right, distance)
        for i := range left {
            left[i] ++
            if left[i] > distance {
                continue
            }
            list = append(list, left[i])
        }
        for i := range right {
            right[i] ++
            if right[i] > distance {
                continue
            }
            list = append(list, right[i])
        }
        for i := range left {
            for j := range right {
                if left[i] + right[j] <= distance {
                    ans ++
                }
            }
        }
        return list
    }
    dfs(root, distance)
    return ans
}