题目:
给你二叉树的根节点 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
}