2049. 统计最高分的节点数目-数组树构造+遍历求解最大值数目

news/2024/7/20 21:55:19 标签: 深度优先, 算法, 数据结构

2049. 统计最高分的节点数目-数组树构造+遍历求解最大值数目

给你一棵根节点为 0 的 二叉树 ,它总共有 n 个节点,节点编号为 0 到 n - 1 。同时给你一个下标从 0 开始的整数数组 parents 表示这棵树,其中 parents[i] 是节点 i 的父节点。由于节点 0 是根,所以 parents[0] == -1 。

一个子树的 大小 为这个子树内节点的数目。每个节点都有一个与之关联的 分数 。求出某个节点分数的方法是,将这个节点和与它相连的边全部 删除 ,剩余部分是若干个 非空 子树,这个节点的 分数 为所有这些子树 大小的乘积 。

请你返回有 最高得分 节点的 数目 。

示例 1:
在这里插入图片描述

example-1

输入:parents = [-1,2,0,2,0]
输出:3
解释:

  • 节点 0 的分数为:3 * 1 = 3
  • 节点 1 的分数为:4 = 4
  • 节点 2 的分数为:1 * 1 * 2 = 2
  • 节点 3 的分数为:4 = 4
  • 节点 4 的分数为:4 = 4
    最高得分为 4 ,有三个节点得分为 4 (分别是节点 1,3 和 4 )。

示例 2:
在这里插入图片描述

example-2

输入:parents = [-1,2,0]
输出:2
解释:

  • 节点 0 的分数为:2 = 2
  • 节点 1 的分数为:2 = 2
  • 节点 2 的分数为:1 * 1 = 1
    最高分数为 2 ,有两个节点分数为 2 (分别为节点 0 和 1 )。

对于这一题,博主构造了一个数组树,还是很不错的一个数据结构来处理问题,方便我们的一些工作,感兴趣,可以学习一下,关于这种数组树的构造,时间复杂度O(n) 空间复杂度 O(n),解题代码如下:



int  dfs(int **tree,int now,int * tree_sum){
    if(now!=-1){
        int l=dfs(tree,tree[now][0],tree_sum);
        int r=dfs(tree,tree[now][1],tree_sum);
        tree_sum[now]=1+l+r;

        return l+r+1;


    }
    else{
        return 0;
    }
}
long long max;
int count;
void stasticals_tree(int **tree,int now,int * tree_sum,int pre,int sum){
     if(now!=-1){
          long long pre_sum,left_sum,right_sum;
          if(tree[now][0]!=-1){
               left_sum=tree_sum[tree[now][0]];

          }
          else{
              left_sum=0;

          }
           if(tree[now][1]!=-1){
               right_sum=tree_sum[tree[now][1]];

          }
          else{
              right_sum=0;

          }
          

         if(pre==-1){
                 pre_sum=0;
            }
            else{
                pre_sum=sum-left_sum-right_sum-1;
            

            }
        //  printf("||%d %d %d ",pre_sum,right_sum,left_sum);
     max=fmax(max,fmax(1,pre_sum)*fmax(1,right_sum)*fmax(1,left_sum));
     stasticals_tree(tree,tree[now][0],tree_sum,now,sum);
     stasticals_tree(tree,tree[now][1],tree_sum,now,sum);
   

     }
    
}

void stasticals_treefind(int **tree,int now,int * tree_sum,int pre,int sum){
     if(now!=-1){
          int pre_sum,left_sum,right_sum;
          if(tree[now][0]!=-1){
               left_sum=tree_sum[tree[now][0]];

          }
          else{
              left_sum=0;

          }
           if(tree[now][1]!=-1){
               right_sum=tree_sum[tree[now][1]];

          }
          else{
              right_sum=0;

          }
          

         if(pre==-1){
                 pre_sum=0;
            }
            else{
                pre_sum=sum-left_sum-right_sum-1;
            

            }
      //    printf("||%d %d %d ",pre_sum,right_sum,left_sum);
        if(fmax(1,pre_sum)*fmax(1,right_sum)*fmax(1,left_sum)==max){
            count++;
        }
     stasticals_treefind(tree,tree[now][0],tree_sum,now,sum);
     stasticals_treefind(tree,tree[now][1],tree_sum,now,sum);
   

     }
    
}


int countHighestScoreNodes(int* parents, int parentsSize){
    int **tree=(int **)malloc(sizeof(int *)*parentsSize);
     int *tree_sum=(int *)malloc(sizeof(int )*parentsSize);

  
    for(int i=0;i<parentsSize;i++){
        tree[i]=(int *)malloc(sizeof(int )*2);
        tree[i][0]=-1;
        tree[i][1]=-1;
    }
    for(int i=1;i<parentsSize;i++){
        
        if(tree[parents[i]][0]==-1){
            tree[parents[i]][0]=i;

        }
        else{
            tree[parents[i]][1]=i;
        }
       
    }
    dfs(tree,0,tree_sum);
    //  for(int i=0;i<parentsSize;i++){
    //   //    printf("left rigt %d %d ",tree[i][0],tree[i][1]);
      //    printf("sum %d ",tree_sum[i]);

    //  }
     int sum=tree_sum[0];
      max=0;
      count=0;
     stasticals_tree(tree,0,tree_sum,-1,sum);
     printf("max %d ",max);
     stasticals_treefind(tree,0,tree_sum,-1,sum);


     return count;


}









http://www.niftyadmin.cn/n/10849.html

相关文章

论文阅读09——《Deep Fusion Clustering Network》

论文阅读09——《Deep Fusion Clustering Network》 原文链接&#xff1a;论文阅读09——《Deep Fusion Clustering Network》 作者&#xff1a;Wenxuan Tu, Sihang Zhou, Xinwang Liu, Xifeng Guo, Zhiping Cai, En zhu, Jieren Cheng 发表时间&#xff1a;2021年5月18日 论文…

4款企业常用的工时管理系统盘点

4款企业常用的工时管理系统有&#xff1a;1、Excel&#xff1b;2、8Manage 工时表&#xff1b;3、诺明软件&#xff1b;4、Aceteamwork。 “时间就是金钱”&#xff0c;相信大家都听过这句话。对于企业来说&#xff0c;管理员工工时&#xff0c;其实就是管理企业的人力成本和实…

第七章 数学 AcWing 1533. 1 的个数

第七章 数学 AcWing 1533. 1 的个数 原题链接 AcWing 1533. 1 的个数 算法标签 数学 枚举 数位DP 思路 显然&#xff0c;直接暴力枚举时间复杂度 230(枚举N个数)∗10(枚举N个数每一位)≈10102^{30}(枚举N个数)*10(枚举N个数每一位)\approx10^{10}230(枚举N个数)∗10(枚举…

vue 动态表单优秀案例

不同的下拉框 就会显示不同的表单&#xff0c;表单配置是灵活匹配的&#xff0c;还有就是 一定要知道都有哪些类型的数据做到兼容起来。 app.vue <template><a-select v-model:value"FormDataSelect" :options"FormDataSelectList" /><a-fo…

常见移动端导航类型

手机导航设计是人机交互最重要的桥梁和平台&#xff0c;旨在引导用户正确的方向&#xff0c;不迷路。 好的菜单设计不仅能提升整个产品的用户体验&#xff0c;还能让用户耳目一新。 一、导航菜单的作用是什么 &#xff1f; 1.提升产品内容和功能结构和层次 2.重点展示核心功能…

蓝屏page_fault_in_nonpaged_area的解决办法

用户在操作电脑的过程中&#xff0c;难免会遇到蓝屏问题&#xff0c;最近就有用户遇到电脑蓝屏重启无限循环&#xff0c;提示代码page_fault_in_nonpaged_area&#xff0c;这要如何解决呢&#xff1f;下面就来看看详细的解决办法。 page_fault_in_nonpaged_area蓝屏代码解决方法…

RK3568平台开发系列讲解(图像篇)JPEG图像处理

🚀返回专栏总目录 文章目录 一、JPEG文件格式和libjpeg编译二、libjpeg接口函数三、JPEG文件解析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢我们今天来讲解JPEG图像处理。 一、JPEG文件格式和libjpeg编译 JPEG的后缀名为.jpg的图像文件。对于图像内容和信息相同…

图05 --- 最短路径问题:算法与实现

💖💖感谢各位观看这篇文章,💖💖点赞💖💖、收藏💖💖、你的支持是我前进的动力!💖💖 💖💖感谢你的阅读💖,专栏文章💖持续更新!💖关注不迷路!!💖 图01—图的基本概念与模型_ 图02— 存储结构: 邻接矩阵,关联矩阵,权矩阵,邻接表,十字链…