1530. 好叶子节点对的数量

题意:传送门

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

思路:重新建图,建图过程中统计叶子结点下标。然后以每个叶子结点为根,遍历该图,统计好叶子节点对数的数量,因为对于每个叶子结点我们都会访问他两次,所以答案/2

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
 #define pb push_back
class Solution {
public:
    vector<int>e[1025];
    vector<int>ye;
    int cot=0,ans=0,dis;
    void dfs(TreeNode *root,int fa)//建图
    {
        int idx=++cot;
        if(fa!=-1)//1是根,没有父亲
        {
            e[idx].pb(fa);
            e[fa].pb(idx);
        }
        if(root->left==nullptr&&root->right==nullptr)ye.pb(idx);
        if(root->left!=nullptr)dfs(root->left,idx);
        if(root->right!=nullptr)dfs(root->right,idx);
    }
    void dfs2(int now,int fa,int dep)//当前节点,当前节点的父亲,深度
    {
        if(e[now].size()==1&&e[now][0]==fa)//开始的叶子结点他的父亲是e[now][0],所以通过e[now][0]==fa可以筛掉起始叶子结点
        {
            if(dep<=dis&&now!=1)ans++;//1为根节点,避免出现1为叶子结点
            return ;
        }
        for(int i=0;i<e[now].size();i++)
        {
            int v=e[now][i];
            if(v!=fa)dfs2(v,now,dep+1);
        }
    }
    int countPairs(TreeNode* root, int distance) {
        dfs(root,-1);
        dis=distance;
        // cout<<ye.size()<<"\n";
        for(int i=0;i<ye.size();i++)
        {
            dfs2(ye[i],-1,0);
            // cout<<ye[i]<<"\n";
        }
        return ans/2;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值