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

news2024/11/29 22:50:00

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.coloradmin.cn/o/26378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

音视频 - 视频编码原理

目录 视频编码主要分为 图像的冗余 熵编码 帧内预测 帧间预测 DCT变换和量化 编码器比较 清晰度和耗时对比 一部电影1080P&#xff0c;帧率25fps&#xff0c;时长2小时&#xff0c;文件大小 1920x1080x1.5x25x2x360 521.4G 数据量非常大&#xff0c;对存储和网络传输都…

GMC Graph-Based Multi-View Clustering

GMC Graph-Based Multi-View Clustering 基于图的多视图聚类 abstract 现有的大多数方法没有充分考虑不同视图的权重&#xff0c;需要额外的聚类步骤来生成最终的聚类。还通常基于所有视图的固定图相似矩阵来优化目标。 本文提出了一种通用的基于图的多视图聚类算法(GMC)来解…

Android程序设计之学生考勤管理系统

基于安卓平台开发的学生考勤管理系统&#xff0c;本系统采用java语言设计&#xff0c;数据存储使用SQLite轻量级数据库实现 SQLite 简介 SQLite是一个软件库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite是一个增长最快的数据库引擎&…

JSON 对比工具

文章目录JSON对比工具JSON对比工具 JSON 是 Web 开发领域中最常用的数据传输格式之一&#xff0c;因为 JSON 的可读性较高&#xff0c;对于一些简单的 JSON 数据&#xff0c;我们不需要借助任何工具就可以轻易的读取。但对于复杂的 JSON 数据就需要借助工具才行&#xff0c;本…

公众号文案写作技巧有哪些?教你几招

公众号文案写作是每个公众号运营者心中的痛&#xff1a; 你是否每天纠结写什么&#xff1f; 你是否写着写着就词穷了&#xff1f; 你是否不知道该如何下手&#xff1f; 公众号文案应该怎么写&#xff1f;今天伯乐网络传媒就来给大家分享一份超实用的公众号文案写作技巧&…

增量模型和迭代模型的优点与缺点

增量模型&#xff1a; 举个例子&#xff1a; 用户有一个需求&#xff0c;功能包含A,B,C... ABC 增量模型&#xff1a; 开发完A我就直接上线供给用户去使用 开发完C我就直接上线供给用户去使用 开发完B我就直接上线供给用户去使用 增量模型的特点 增量模型的特点…

度量BGP监测源数量对AS可见性的影响

首先&#xff0c;本文介绍了两个公开的BGP数据源项目情况&#xff1b;其次&#xff0c;从可见AS数量和可见AS边关系数量两个方面来分析度量BGP监测源中对等AS的可见性。 BGP数据源介绍 BGP数据源有2个公开的项目&#xff0c;分别是RIPE RIS和Route Views&#xff0c;它们使用路…

VUE基础编程(三)

案例要求 基于Vue Cli和嵌套路由技术&#xff0c;完成以下功能&#xff1a; 站点打开后会默认显示如图3.1所示的“关于公司”页面&#xff0c;单击图3.1页面上的“公司简介”链接&#xff0c;站点会显示如图3.2所示的“公司简介”页面&#xff0c;单击图3.1页面上的“公司治理…

【JAVA程序设计】基于SSM的学校教务管理系统-有文档

基于SSM的学校教务管理系统-有文档项目获取项目简介开发环境项目技术功能结构文档目录运行截图项目获取 获取方式&#xff08;点击下载&#xff09;&#xff1a;是云猿实战 项目经过多人测试运行&#xff0c;可以确保100%成功运行。 项目简介 本项目是基于SSM的学校教务管理…

[附源码]java毕业设计校园失物招领平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

idea反编译

1、问题描述 只有jar包&#xff0c;反编译下&#xff0c;看几个配置&#xff1b; 2、问题说明 用的idea里面的插件&#xff0c;java Decoplier&#xff0c;可以反编译jar包&#xff0c;效果挺好的&#xff0c;反编译出来的.java没乱码&#xff0c;可以直接看&#xff1b; 2…

139.深度学习分布式计算框架-2

139.1 Spark MLllib MLlib(Machine Learnig lib) 是Spark对常用的机器学习算法的实现库&#xff0c;同时包括相关的测试和数据生成器。MLlib是MLBase一部分&#xff0c;其中MLBase分为四部分&#xff1a;MLlib、MLI、ML Optimizer和MLRuntime。 ML Optimizer会选择它认为最适合…

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

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

数据结构-难点突破(C++实现树的双亲表示法,孩子表示法,孩子兄弟表示法(树转化为二叉树))

文章目录1. 树的双亲表示法2. 孩子表示法3. 孩子兄弟表示法&#xff08;树转化为二叉树&#xff09;普通树的存储一半采用三种方式&#xff1a; 双亲表示法&#xff1b;孩子表示法&#xff1b;孩子兄弟表示法&#xff1b; 1. 树的双亲表示法 思路和图片来源 采用双亲表示法…

智慧停车解决方案-最新全套文件

智慧停车解决方案-最新全套文件一、建设背景痛点分析二、建设思路准确、安全、可靠、及时性原则统一规划、分布实施保护以往投资、整合现有资源资源共享和整体性、统一性原则可扩展性原则三、建设方案四、获取 - 智慧停车全套最新解决方案合集一、建设背景 痛点分析 随着经济…

stm32cubemx hal学习记录:FreeRTOS事件

一、事件 事件是一种实现任务间通信的机制&#xff0c;主要用于实现多任务间的同步&#xff0c;但事件通信只能是事件类型的通信&#xff0c;无数据传输。与信号量不同的是&#xff0c;它可以实现一对多&#xff0c;多对多的同步。即一个任务可以等待多个事件的发生&#xff1a…

C语言源代码系列-管理系统之机房机位预定系统

往期文章分享点击跳转>《导航贴》- Unity手册&#xff0c;系统实战学习点击跳转>《导航贴》- Android手册&#xff0c;重温移动开发 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过…

华为电量分段图表实现过程

以前一直是改的MPAndroidChart&#xff0c;但最近看到华为手机的电池图表发现一旦设计不符合常规图表逻辑实现起来就很困难&#xff0c; 考虑过path相减(areaPath.op(-,- Path.Op.DIFFERENCE))、图像混合&#xff08;paint.setXfermode&#xff09;、裁剪区域&#xff08;clipR…

学生HTML个人网页作业作品下载 动漫主题网页设计制作 大学生个人网站作业模板 dreamweaver简单个人网页制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

vue3面试题

文章目录一、vue3有了解过吗&#xff1f;能说说跟vue2的区别吗&#xff1f;1.vue3介绍2.vue3的新特性&#xff1a;2.1速度更快2.2体积更小2.3更易维护2.4更好的Typescript支持2.5编译器重写2.6更接近原生2.7更易使用3.vue3新增特性framentsTeleportcreateRenderercomposition A…