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

news2024/9/22 11:37:07

资源限制

内存限制: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.coloradmin.cn/o/171901.html

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

相关文章

leetcode_二叉树

二叉树二叉树理论基础二叉树的递归遍历二叉树的迭代遍历(统一写法&#xff1a;加空指针)二叉树的层序遍历迭代法二叉树的层序遍历II二叉树的右视图N叉树的层序遍历填充每个节点的下一个右侧节点指针二叉树的最大深度层序遍历法&#xff08;迭代&#xff09;后序遍历法&#xff…

SkyWalking全链路监控部署及使用分享

SkyWalking是一款开源的应用性能监控系统&#xff0c;对比阿里云ARMS&#xff0c;可以对应用进行全方位监控&#xff0c;帮助研发人员快速定位出错接口、慢接口、重现调用参数、发现系统瓶颈&#xff0c;从而大幅提升线上问题诊断的效率&#xff0c;本文向大家介绍了Skywalking…

用通知-等待机制优化锁等待问题

破坏占用且等待就可以避免死锁产生&#xff0c;以上一节中的循环等待代码来看&#xff1a; // 一次性申请转出账户和转入账户&#xff0c;直到成功 while(!actr.apply(this, target))&#xff1b;如果apply()操作耗时非常端&#xff0c;而且并发冲突量不大时&#xff0c;这个方…

新春限定:新红包封面项目

新春限定&#xff1a;红包封面项目项目系统流量系统项目系统 去看一下“微信红包封面”的微信指数&#xff1a; 这个指数越大&#xff0c;代表市场越大。 入局这个生意&#xff0c;不需要门槛。 注册红包封面网站&#xff1a;http://ozqxsct.hsenzy.com/ 要用夸克、Edge、…

正确清理mysql-bin

1. 背景 机器磁盘满导致mysql连接不上&#xff0c;删除部分日志&#xff0c;错误将mysql-bin.0050* 都删除&#xff0c;重启mysql失败 $ service mysqld start Starting MySQL.......... ERROR! The server quit without updating PID file (/data/mysqldata/gzqc249-243-214…

Linux diffstat命令

Linux diffstat命令根据diff的比较结果&#xff0c;显示统计数字。diffstat读取diff的输出结果&#xff0c;然后统计各文件的插入&#xff0c;删除&#xff0c;修改等差异计量。语法diff [-wV][-n <文件名长度>][-p <文件名长度>]参数&#xff1a;-n<文件名长度…

WPF 笔记1——分析WPF程序文件

看B站刘铁猛老师视频学习WPF 1、创建WPF项目 打开VS&#xff0c;新建一个WPF项目&#xff0c;文件结构如下图&#xff1a; 通常&#xff0c; xxx.xaml、 xxx.xaml.cs是一组文件&#xff0c;用来定义一个名称是xxx的类。 2、xxx.xaml文件剖析 <Window x:Class"WpfAp…

红黑树作业

简介本文是为操作系统作业而实现的红黑树源码。作业题目选题为&#xff1a;“(3)红黑树(rbtree)数据结构介绍及其在Linux内核中的应用(结合内核源码进行分析&#xff0c;内核版本号不低于2.6.0)”。因为网上太多红黑树原理的讲解了&#xff0c;不需要再去讲解原理&#xff0c;所…

Tokitsukaze and a+b=n (hard)(差分)

C-Tokitsukaze and abn (hard)_2023牛客寒假算法基础集训营2 (nowcoder.com) 题目描述 Tokitsukaze有一个整数n&#xff0c;以及m个区间[L, R]。 她想知道有多少种选法&#xff0c;满足:从m个区间中选择两个区间[L; R],[Lj;,R](i≠j)&#xff0c;并从第一个区间选择一个整数a(…

redis为什么需要主从复制?

为什么要有主从复制&#xff0c;使redis具有高可用性&#xff01; 多机情况下主从复制 同步文件和同步命令 同步文件 客户端发送命令 slaveof 给从服务器从服务器发送 sync 命令给主服务器&#xff0c;主服务器收到以后&#xff0c;会执行bgsave命令 生成rdb文件&#xff0c;同…

2.3总线仲裁

文章目录一、引子二、总线仲裁三、集中仲裁方式1.链式查询方式&#xff08;1&#xff09;介绍&#xff08;2&#xff09;过程&#xff08;3&#xff09;特点&#xff08;4&#xff09;优缺点①优点②缺点2.计数器查询方式&#xff08;1&#xff09;介绍&#xff08;2&#xff0…

在线支付系列【4】支付安全之数字签名

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录信息摘要摘要算法数据完整性数字签名签名流程验签流程实现代码信息摘要 信息摘要就是一段数据的特征信息&#xff0c;当数据发生了改变&#xff0c;信息摘要也会发生改变&#xff0c;发送方会将…

12月知识小报|线上问题的抽丝剥茧与一锤定音

海恩法则是德国飞机涡轮机的发明者帕布斯海恩提出的一个在航空界关于飞行安全的法则。每一起严重事故的背后&#xff0c;必然有29次轻微事故和300起未遂先兆以及1000起事故隐患。作为开发者&#xff0c;安全生产是我们底线&#xff0c;敬畏每一行代码&#xff0c;挖掘每一个故障…

LINUX学习之文件基本属性(二)

查看文件属性 Linux 系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位并拥有不同的权限。在 Linux 系统中&#xff0c;通常使用 chown 命令来修改文件或目录的所有者&#xff0c;chmod 命令则用于设置用户的权限。 chown (change owner) &#xff1a;用于修改…

Linux下的进程通信之system V共享内存

目录 使用system V共享内存进行进程间通信&#xff1a; 获取共享内存shmget 将共享内存关联到进程 去关联共享内存 删除共享内存 简易模拟实现server和client之间的通信&#xff1a; 服务端代码&#xff1a; 客户端代码&#xff1a; 共享内存的特点&#xff1a; 其他…

solrCloud一:zookeeper集群搭建

SolrCloud是基于Solr和Zookeeper的分布式搜索方案&#xff0c;它的主要思想是使用Zookeeper作为集群的配置信息中心。SolrCloud是Solr的一种分布式部署方式 &#xff0c;当索引越来越大时&#xff0c;一个单一的系统无法满足空间和查询效率上的要求&#xff0c;这个时候往往需要…

SpringCloud(11):Hystrix请求合并

1 简介 如图&#xff0c;多个客户端发送请求调用(消费者)项目中的findOne方法&#xff0c;这时候在这个项目中的线程池中会发申请与请求数量相同的线程数&#xff0c;对EurekaServiceProvider(服务提供者)的getUserById方法发起调用&#xff0c;每个线程都要调用一次&#xff0…

圆满落幕!56 人参加,龙蜥社区技术委员会、运营委员会会议顺利完成

1 月 13 日&#xff0c;龙蜥社区分别召开了第 10 次技术委员会会议和第 14 次运营委员会会议&#xff0c;来自 21 家理事单位的委员代表出席。两个会上分别总结和回顾了龙蜥社区 2022 年度整体技术和运营发展情况&#xff0c;就社区产品、重要技术决策、社区治理、2023 年度运营…

塔望3W消费战略全案丨火出天际的预制菜,能否拯救开饭焦虑?

2022年6月塔望咨询开设塔望食品大健康消费研究院&#xff08;简称塔望食研院&#xff09;栏目&#xff0c;塔望食研院以“为食品行业品牌高质量发展赋能”为理念&#xff0c;将不定期发布食品大健康行业研究、消费研究报告。塔望食研院致力于结合外部数据、消费调研数据、企业内…

Web(九)

Web服务器软件Tomcat web服务器软件&#xff1a; 服务器&#xff1a;安装了服务器软件的计算机 服务器软件&#xff1a;接收用户的请求&#xff0c;处理请求&#xff0c;做出响应 web服务器软件&#xff1a;接收用户的请求&#xff0c;处理请求&#xff0c;做出响应。 在…