【蓝桥杯】历届真题 左hai子右兄弟(省赛)Java

news/2023/6/7 22:48:19

资源限制

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述

        对于一棵多叉树,我们可以通过 “左孩子右兄弟” 表示法,将其转化成一棵二叉树。

        如果我们认为每个结点的子结点是无序的,那么得到的二叉树可能不唯一。换句话说,每个结点可以选任意子结点作为左孩子,并按任意顺序连接右兄弟。

        给定一棵包含 N​​ 个结点的多叉树,结点从 1​​ 至 N​ 编号,其中 1 号结点是根,每个结点的父结点的编号比自己的编号小。请你计算其通过 “左孩子右兄弟” 表示法转化成的二叉树,高度最高是多少。

注:只有根结点这一个结点的树高度为 0​

        例如如下的多叉树:

  

输入格式
        输入的第一行包含一个整数 N​​​。

        以下 N−1​​ 行,每行包含一个整数,依次表示 2​ 至 N 号结点的父结点编号。

输出格式
        输出一个整数表示答案。

样例输入
5
1
1
1
2
样例输出
4

评测用例规模与约定
        对于 30%​​ 的评测用例,1≤N≤20​;
        对于所有评测用例,1≤N≤100000。

【基础知识要求】

        首先要知道何为“左孩子右兄弟”表示法,不然这个题是要直接pass的。

        何为“左孩子右兄弟”表示法?

        答:大家都知道,在树结构中,同一层的节点互为兄弟节点。上层与下层相连的节点为父子节点。那么,所谓的“孩子兄弟表示法”,指的是用将整棵树用二叉链表存储起来,从树的根节点开始,依次存储各个结点的孩子结点和兄弟结点。

        因此,各个节点又包含了三部分内容:

        1.节点的值;

        2.指向孩子结点的指针;

        3.指向兄弟结点的指针;

        

         而通过孩子兄弟表示法,任意一棵普通树都可以相应转化为一棵二叉树,它们之间是一一对应的。因此,孩子兄弟表示法可以作为将普通树转化为二叉树的最有效方法,通常又被称为"二叉树表示法"或"二叉链表表示法"。

思路与分析

       从根节点向下看,当前节点的最深深度 = 当前节点的子节点(一个在左,其他的节点都在右侧。因为左孩子右兄弟的原则) + 所有子节点距离当前子节点的最深深度。也就是说,树的最大高度=父节点孩子的数目+以它的孩子为父节点的子树的最大高度。

        同样,题内有一个细节需要我们注意:根结点这一个结点的树高度为 0​

代码

import java.util.*;public class Main {//声明一个数据类型,模拟二叉树public static Map<Integer,ArrayList<Integer>> erTree = new HashMap<>();public static void main(String[] args) {Scanner sc = new Scanner(System.in);//使用Integer这一包装类而不使用int的原因为:Integer是对象,int仅表示值Integer n = sc.nextInt();for(int i = 2; i <= n; i++) {Integer fa = sc.nextInt();//判断是否存在该父节点,没有则添加if(!erTree.containsKey(fa)) {ArrayList<Integer> list = new ArrayList<>();erTree.put(fa,list);}erTree.get(fa).add(i);}System.out.println(shen(1));}public static int shen(int n) {//通过判断舍弃无效数据,优化运算量if(!erTree.containsKey(n)) {return 0;}//获得子树ArrayList<Integer> list = erTree.get(n);//获得以1为父节点的孩子节点的数目int size = list.size();int max = 0;//遍历子树,获得以n为父节点的子树的最大高度for(Integer i : list) {max = Math.max(max,shen(i));}return size + max;}
}

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4557627.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

虹软1:N 基于mysql的插件udf 人脸比较速度优化。。。。

环境 linux x64 刚开始是将人脸特征数据全部加载到内存&#xff0c;然后遍历内存&#xff0c;进行比较。 后面偶尔看到了 mysql UDF(Userdefined function)的开发&#xff0c;用户自定义函数&#xff0c;于是想到可以把比较函数放到sql语句里&#xff0c;这样的话 每次查询不…

SAP FICO 详细解析新总账功能 - 平行分类账配置

平行分类账配置 其作用简单来说就是&#xff0c;同时一笔记账&#xff0c;会产生多个账套的凭证。 【配置流程】 1、定义总账会计核算的分类账 账套可以有多个&#xff0c;但是主分类账有且只有一个。 表FAGLFLEXT就是存储所有财务分类账发生额数据的汇总表。 勾选多个“主…

IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理

1、前言 一个安全的信息系统&#xff0c;合法身份检查是必须环节。尤其IM这种以“人”为中心的社交体系&#xff0c;身份认证更是必不可少。 一些PC时代小型IM系统中&#xff0c;身份认证可能直接做到长连接中&#xff08;也就是整个IM系统都是以长连接为中心&#xff1a;身份鉴…

【JavaScript】事件相关知识详解

&#x1f4bb; 【JavaScript】事件相关知识详解&#x1f3e0;专栏&#xff1a;JavaScript &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享方向&#xff1a;目前主攻前端…

Spring @Autowired 用法

Spring Autowired 用法首先看下Component举例 1 :举例 2 :验证是否调用的是默认构造器如何&#xff0c;在启动的时候执行有参数的构造函数&#xff1f;&#xff1f;&#xff0c;这就要看Autowired注解了&#xff01;Autowired注解首先看下Component 在类级别上添加了Component…

第四章 道德经第四章原文 道德经第四章译文

道德经第四章原文 道冲①&#xff0c;而用之有弗盈也②。渊呵③&#xff01;似万物之宗④。锉其兑⑤&#xff0c;解其纷⑥&#xff0c;和其光⑦&#xff0c;同其尘⑧。湛呵⑨&#xff01;似或存⑩。吾不知其谁之子&#xff0c;象帝之先⑾。 道德经第四章译文 大“道”空虚开形…

Swift(2)

因为要在31号之前用swift写一个系统&#xff0c;我不得不把我的电脑系统更新了一下&#xff0c;之后便下载了这个&#xff0c; 做了一些简单的测试&#xff0c;部分软件还是可以打开的。 这个软件用着的确比那个网站用着要舒服很多。 目录 问号 感叹号 ​编辑if else ​编…

“注水”的新力与“错付”的陈凯

“明星职业经理人”陈凯终究还是没迈过三年的坎儿&#xff0c;只是这次“错付”竟只有半年。 能以120万元的“微薄”年薪吸引明星职业经理人的加盟&#xff0c;这个公司并不简单。作为地产界的“黑马”&#xff0c;新力控股集团有限公司(HK:02103)几年时间实现了业绩突飞猛进&…