第十二届蓝桥杯省赛A组试题:左儿子右兄弟Java
【问题描述】
对于一棵多叉树,我们可以通过 “左孩子右兄弟” 表示法,将其转化成一棵二叉树。如果我们认为每个结点的子结点是无序的,那么得到的二叉树可能不唯一。换句话说,每个结点可以选任意子结点作为左孩子,并按任意顺序连接右兄弟。给定一棵包含 N 个结点的多叉树,结点从 1 至 N 编号,其中 1 号结点是根,每个结点的父结点的编号比自己的编号小。请你计算其通过 “左孩子右兄弟” 表示法转化成的二叉树,高度最高是多少。注:只有根结点这一个结点的树高度为 0 。例如如下的多叉树:
可能有以下 3 种 (这里只列出 3 种,并不是全部) 不同的 “左孩子右兄弟”表示:
其中最后一种高度最高,为 4。
【输入格式】
输入的第一行包含一个整数 N。
以下 N −1 行,每行包含一个整数,依次表示 2 至 N 号结点的父结点编号。
【输出格式】
输出一个整数表示答案。
【样例输入】
5
1
1
1
2
【样例输出】
4
【评测用例规模与约定】
对于 30% 的评测用例,1 ≤ N ≤ 20;
对于所有评测用例,1 ≤ N ≤ 100000。
解题思路:①看到树并且根据题意可以知道类似求最长路径,可以使用深度优先搜索dfs算法,即找节点的孩子,再继续找该孩子的孩子…直到没有再回退。②可以使用一个ArrayList数组来存储每个节点及其孩子(类似图的邻接表存储),也就是说ArrayList数组的元素也是ArrayList,每个ArrayList元素存储着该节点及其子孩子。
Java代码:
import java.util.ArrayList;
import java.util.Scanner;public class Tree {static int res = 0; //结果(最高树高)static ArrayList<Integer>[] lists; //存储节点及其子孩子(类似一个邻接表)public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();lists = new ArrayList[n+1]; //后面我们是从下标1开始存储,因此这里不要忘记+1//初始化(相当于填充进每个节点,数组下标即为该节点编号)for (int i = 1; i < n+1; i++) {lists[i] = new ArrayList<Integer>();}//构建邻接表,将每个节点的孩子放到该下标的ArrayList里for (int i = 2; i < n+1; i++) {int node = scanner.nextInt();lists[node].add(i);}//从节点1(即根节点)开始dfs即可访问全部,因为这是一棵树dfs(0,1);System.out.println(res);}//深度优先搜索dfspublic static void dfs(int total, int father){//获取当前节点孩子个数int size = lists[father].size();//如果当前节点没有孩子,则重置res并返回if (size == 0) {res = Math.max(res,total);return;}//对该节点的孩子依次进行dfsfor (int temp : lists[father]){dfs(total+size,temp);}}
}
第十二届蓝桥杯省赛A组试题:左儿子右兄弟Java相关推荐
- 十二届蓝桥杯省赛B组C++解析(填空题部分)
十二届蓝桥杯省赛B组C++解析(填空题部分) 目录 十二届蓝桥杯省赛B组C++解析(填空题部分) A:空间 B:卡片 C:直线 D:货物摆放 E:路径 A:空间 该题是一道计算机基础原理题,这里需要了 ...
- 2021年软件类第十二届蓝桥杯 省赛 python组 F-J题解
2021年软件类第十二届蓝桥杯 省赛 python组 F-J题解 文章目录 2021年软件类第十二届蓝桥杯 省赛 python组 F-J题解 试题 F:时间显示 题目描述 输入描述 输出描述 输入输出 ...
- 2021年第十二届蓝桥杯省赛B组(C/C++)第二场题解
文章目录 2021年第十二届蓝桥杯省赛B组(C/C++)第二场题解 1.求余 2.双阶乘 3.格点 4.整数分解 5.城邦 6.特殊年份 7.小平方 8.完全平方数 9.负载均衡 10.国际象棋 20 ...
- 2021第十二届蓝桥杯省赛B组C/C++ 试题 E: 路径
2021第十二届蓝桥杯省赛B组C/C++ 试题 E: 路径 代码 试题 E: 路径 Ans=10266837 我哭了 最短路径的题考前刷了多少道,最后还是在考场翻车 还是太菜啊啊.. 首先是边权图的初 ...
- 2021年第十二届蓝桥杯省赛B组(C/C++)个人题解
Problem A 空间 计组基础题:256MB=256 * 2^20 * 8 位 所以存放32位元素可以存放 256 * 1024 * 1024 * 8 / 32 ans: 67108864 送分题 ...
- 2021年第十二届蓝桥杯省赛B组C/C++部分填空题解
题A: 看到题意很容易算出答案就是256乘1024乘1024乘8除以32 答案:67108864 题B: 直接模拟就好了,用一个数组来记录每个数字的次数,暴力到数组该数字不够时,就不能表示完这个数字. ...
- 【蓝桥杯】2019年第十届蓝桥杯省赛B组试题J — 灵能传输(前缀和,猜想结论)难度⭐⭐⭐⭐
整理的算法模板合集: ACM模板 蓝桥杯的题还是有难题的.这道题的可行性证明比较麻烦,但是代码比较简单. 学到了新的序列操作.前缀和的应用,前缀和还是学的不够扎实,晚上再复习一遍. #include& ...
- 第十二届蓝桥杯省赛JavaC组【第二场】真题——详细答案对照(完整版)
目录 #A 浮点数 #B 求余 #C 双阶乘 #D 格点 #E 整数分解 #F 3 的倍数 #G 特殊年份 #H 小平方 #I 完全平方数 #J 负载均衡 #A 浮点数 本题总分:5 分 问题描述 I ...
- 第十二届蓝桥杯省赛A组砝码称重Java解题思路及代码
[问题描述] 你有一架天平和 N个砝码,这N个砝码重量依次是W1, W2, -, Wn. 请你计算一共可以称出多少种不同的重量?注意砝码可以放在天平两边. [输入格式] 输入的第一行包含一个整数N. ...
最新文章
- 使用Template时 typename 关键字的用法
- jvm配置参数,查看大对象直接分配到老年代
- java emoji显示乱码_Java 解决Emoji表情过滤问题
- Arrays.asList()的坑
- 英特尔傲腾存储业务主管已离职 因个人原因离开
- 2011年3月四级网络工程师笔试试卷 解答思路
- Visio—如何画矩形虚线边框?
- Focal Loss for Dense Object Detection解读
- php redis菜鸟教程,PHP 使用 Redis
- 破解中兴ZXV10 H108L电信猫超级密码,附赠破解路由限制
- 多线程面试题:词频统计
- 安卓实现图片缩放平移的基本步骤
- 动态规划——钢条切割
- iFunk超极本或出新,你最想知道什么
- 涛涛打保龄球 【map】篝火晚会(两道题)
- 下拉点击跳到指定链接(类同友情链接)
- Android下的串口开发
- kindEditor定义工具栏
- 全方位解析俄语系勒索软件的生态系统
- 新手尝试编写微信小程序(1)——我的第一个微信小程序
热门文章
- 带有批注的Spring硒测试
- 使用Java VisualVM分析您的应用程序
- Shell(bash) 介绍
- 查看数据库 MySQL 的版本信息的命令语句
- android root权限函数,android 4.4下app永久获取root权限的方法
- c++ 提取傅里叶描述子_AI大语音(四)——MFCC特征提取(深度解析)
- aspose word 获取标题_Word干货|多级标题的自动编号怎么添加?
- exe打包工具哪个最好_为你的 Python 程序写个启动工具箱
- android 硬件对接,Android 对接硬件串口篇
- C语言#include还有些你不知道的事