【二叉树-中等】1530. 好叶子节点对的数量

本文介绍了一种算法,用于计算二叉树中所有叶子节点对之间的距离,并统计距离小于等于给定值的节点对数量。该算法首先通过深度优先搜索获取所有叶子节点的路径,然后比较每对叶子节点路径的最近公共祖先来计算它们之间的距离。

题目
提示:

tree 的节点数在 [1, 2^10] 范围内。
每个节点的值都在 [1, 100] 之间。
1 <= distance <= 10
  1. 注意此题根据提示可以知道,不同的节点可能具有相同的数值,所以不能仅仅凭借结点的数值就判断两个节点是否是同一个节点。
  2. 思路:一看到这种路径距离第一反应就是最近公共父节点
    【代码】
    在这里插入图片描述
# 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 dfs(self,root):
        if not root:return 
        self.path.append(root)
        if not root.left and not root.right:
            self.leaf_path.append(self.path[:])
        self.dfs(root.left)
        self.dfs(root.right)
        self.path.pop()
    def countPairs(self, root: TreeNode, distance: int) -> int:
        self.path=[]
        self.leaf_path=[]
        self.dfs(root)
        cnt=0
        for i in range(len(self.leaf_path)):
            for j in range(i+1,len(self.leaf_path)):
                item_i=self.leaf_path[i]
                item_j=self.leaf_path[j]
                idx=0
                for x,y in zip(item_i,item_j):
                    if x!=y:
                        break
                    idx+=1
                if (len(item_i)+len(item_j)-2*idx)<=distance:
                    cnt+=1
        return cnt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值