题目地址(1530. 好叶子节点对的数量)
https://leetcode.cn/problems/number-of-good-leaf-nodes-pairs/
题目描述
给你二叉树的根节点 root 和一个整数 distance 。
如果二叉树中两个 叶 节点之间的 最短路径长度 小于或者等于 distance ,那它们就可以构成一组 好叶子节点对 。
返回树中 好叶子节点对的数量 。
示例 1:
输入:root = [1,2,3,null,4], distance = 3
输出:1
解释:树的叶节点是 3 和 4 ,它们之间的最短路径的长度是 3 。这是唯一的好叶子节点对。
示例 2:
输入:root = [1,2,3,4,5,6,7], distance = 3
输出:2
解释:好叶子节点对为 [4,5] 和 [6,7] ,最短路径长度都是 2 。但是叶子节点对 [4,6] 不满足要求,因为它们之间的最短路径长度为 4 。
示例 3:
输入:root = [7,1,4,6,null,5,3,null,null,null,null,null,2], distance = 3
输出:1
解释:唯一的好叶子节点对是 [2,5] 。
示例 4:
输入:root = [100], distance = 1
输出:0
示例 5:
输入:root = [1,1,1], distance = 2
输出:1
提示:
tree 的节点数在 [1, 2^10] 范围内。
每个节点的值都在 [1, 100] 之间。
1 <= distance <= 10
前置知识
公司
- 暂无
思路
关键点
代码
- 语言支持:Python3
Python3 Code:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def countPairs(self, root: TreeNode, distance: int) -> int:
"""
计算好叶子节点对的数量(叶子节点之间的距离小于distance)
Args:
root(TreeNode):根节点
distance(int):距离限制
Returns:
返回叶子节点数量
解决方法:
1. 两个叶子节点的最短距离=其中一个叶子节点到最近公共祖先的距离+另一个叶子节点到最近公共祖先的距离
2. 那么采用深度遍历的方法,对于一个节点,计算其到左子树叶子节点距离以及到右子树叶子节点距离,然后双重遍历左右子树距离,计算最短距离如果小于等于distance,则满足条件。(因此,采用先序遍历)
3. 对于空节点 返回[]
4. 对于叶子节点,返回[0]
"""
self.ans = 0
def dfs(root):
if not root:
return []
if not root.left and not root.right:
return [0]
ls = [l+1 for l in dfs(root.left)]
rs = [r+1 for r in dfs(root.right)]
# 笛卡尔积
for l in ls:
for r in rs:
if l+r <= distance:
self.ans += 1
return ls+rs
dfs(root)
return self.ans
复杂度分析
令 n 为数组长度。
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)