题目地址(1530. 好叶子节点对的数量)

题目地址(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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值