题目
给你二叉树的根节点根和一个整数距离。如果二叉树中两个叶节点之间的最短路径长度小于或者等于距离,那它们就可以构成一组好叶子节点对。
返回树中好叶子节点对的数量。
示例1:输入:根=[1,2,3,null,4],距离=3输出:1
解释:树的叶节点是3和4 ,它们之间的最短路径的长度是3 。这是唯一的好叶子节点对。
示例2:输入:根=[1,2,3,4,5,6,7],距离=3输出:2
解释:好叶子节点对为[4,5] 和[6,7] ,最短路径长度都是2 。
但是叶子节点对[4,6] 不满足要求,因为它们之间的最短路径长度为4 。
示例3:输入:根=[7,1,4,6,null,5,3,null,null,null,null,null,null,2],距离=3输出:1
解释:唯一的好叶子节点对是[2,5] 。
示例4:输入:根=[100],距离=1输出:0
示例5:输入:根=[1,1,1],距离=2输出:1
提示:树的节点数在[1, 2^10] 范围内。
每个节点的值都在[1, 100] 之间。
1=距离=10
解题思路分析
1、递归;时间复杂度O(n),空间复杂度O(n)func countPairs(root *TreeNode,distance int) int {
_,res :=dfs(根,距离)
返回资源
}
func dfs(root *TreeNode,distance int) (arr []int,count int){ 0
arr=make([]int,距离2)
if root==nil {
返回arr,0
}
如果根左==零根。右==零
arr[1]=1
返回arr,0
}
leftArr,rightArr :=make([]int,距离1)、make([]int、距离1)
左计数,右计数:=0,0
如果根。向左!=零
leftArr,leftCount=dfs(根。左侧,距离)
}
如果根。没错。=零
rightArr,rightCount=dfs(根.右侧,距离)
}
对于I :=1;i=距离;我
arr[i 1]=leftArr[i] rightArr[i]
}
计数=0
对于I :=0;i=距离;我
对于j :=0;j=距离-我;j {
计数=计数左arr[I]*右arr[j]
}
}
返回,向左数,向右数
}2、递归;时间复杂度O(n),空间复杂度O(n)
var res int
func countPairs(root *TreeNode,distance int) int {
res=0
根,距离
返回资源
}
func dfs(root *TreeNode,distance int)(arr[]int){ 0
arr=make([]int,距离2)
if root==nil {
返回逮捕
}
如果根左==零根。右==零
arr[1]=1
返回逮捕
}
leftArr,rightArr :=make([]int,距离1)、make([]int、距离1)
如果根。向左!=零
leftArr=dfs(根。左侧,距离)
}
如果根。没错。=零
rightArr=dfs(根。右侧,距离)
}
对于I :=1;i=距离;我
arr[i 1]=leftArr[i] rightArr[i]
}
对于I :=0;i=距离;我
对于j :=0;j=距离-我;j {
res=res leftArr[i]*rightArr[j]
}
}
返回逮捕
}