【问题描述】
对于一棵多叉树,我们可以通过 “左孩子右兄弟” 表示法,将其转化成一棵二叉树。如果我们认为每个结点的子结点是无序的,那么得到的二叉树可能不唯一。换句话说,每个结点可以选任意子结点作为左孩子,并按任意顺序连接右兄弟。给定一棵包含 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相关推荐

  1. 十二届蓝桥杯省赛B组C++解析(填空题部分)

    十二届蓝桥杯省赛B组C++解析(填空题部分) 目录 十二届蓝桥杯省赛B组C++解析(填空题部分) A:空间 B:卡片 C:直线 D:货物摆放 E:路径 A:空间 该题是一道计算机基础原理题,这里需要了 ...

  2. 2021年软件类第十二届蓝桥杯 省赛 python组 F-J题解

    2021年软件类第十二届蓝桥杯 省赛 python组 F-J题解 文章目录 2021年软件类第十二届蓝桥杯 省赛 python组 F-J题解 试题 F:时间显示 题目描述 输入描述 输出描述 输入输出 ...

  3. 2021年第十二届蓝桥杯省赛B组(C/C++)第二场题解

    文章目录 2021年第十二届蓝桥杯省赛B组(C/C++)第二场题解 1.求余 2.双阶乘 3.格点 4.整数分解 5.城邦 6.特殊年份 7.小平方 8.完全平方数 9.负载均衡 10.国际象棋 20 ...

  4. 2021第十二届蓝桥杯省赛B组C/C++ 试题 E: 路径

    2021第十二届蓝桥杯省赛B组C/C++ 试题 E: 路径 代码 试题 E: 路径 Ans=10266837 我哭了 最短路径的题考前刷了多少道,最后还是在考场翻车 还是太菜啊啊.. 首先是边权图的初 ...

  5. 2021年第十二届蓝桥杯省赛B组(C/C++)个人题解

    Problem A 空间 计组基础题:256MB=256 * 2^20 * 8 位 所以存放32位元素可以存放 256 * 1024 * 1024 * 8 / 32 ans: 67108864 送分题 ...

  6. 2021年第十二届蓝桥杯省赛B组C/C++部分填空题解

    题A: 看到题意很容易算出答案就是256乘1024乘1024乘8除以32 答案:67108864 题B: 直接模拟就好了,用一个数组来记录每个数字的次数,暴力到数组该数字不够时,就不能表示完这个数字. ...

  7. 【蓝桥杯】2019年第十届蓝桥杯省赛B组试题J — 灵能传输(前缀和,猜想结论)难度⭐⭐⭐⭐

    整理的算法模板合集: ACM模板 蓝桥杯的题还是有难题的.这道题的可行性证明比较麻烦,但是代码比较简单. 学到了新的序列操作.前缀和的应用,前缀和还是学的不够扎实,晚上再复习一遍. #include& ...

  8. 第十二届蓝桥杯省赛JavaC组【第二场】真题——详细答案对照(完整版)

    目录 #A 浮点数 #B 求余 #C 双阶乘 #D 格点 #E 整数分解 #F 3 的倍数 #G 特殊年份 #H 小平方 #I 完全平方数 #J 负载均衡 #A 浮点数 本题总分:5 分 问题描述 I ...

  9. 第十二届蓝桥杯省赛A组砝码称重Java解题思路及代码

    [问题描述] 你有一架天平和 N个砝码,这N个砝码重量依次是W1, W2, -, Wn. 请你计算一共可以称出多少种不同的重量?注意砝码可以放在天平两边. [输入格式] 输入的第一行包含一个整数N. ...

最新文章

  1. 使用Template时 typename 关键字的用法
  2. jvm配置参数,查看大对象直接分配到老年代
  3. java emoji显示乱码_Java 解决Emoji表情过滤问题
  4. Arrays.asList()的坑
  5. 英特尔傲腾存储业务主管已离职 因个人原因离开
  6. 2011年3月四级网络工程师笔试试卷 解答思路
  7. Visio—如何画矩形虚线边框?
  8. Focal Loss for Dense Object Detection解读
  9. php redis菜鸟教程,PHP 使用 Redis
  10. 破解中兴ZXV10 H108L电信猫超级密码,附赠破解路由限制
  11. 多线程面试题:词频统计
  12. 安卓实现图片缩放平移的基本步骤
  13. 动态规划——钢条切割
  14. iFunk超极本或出新,你最想知道什么
  15. 涛涛打保龄球 【map】篝火晚会(两道题)
  16. 下拉点击跳到指定链接(类同友情链接)
  17. Android下的串口开发
  18. kindEditor定义工具栏
  19. 全方位解析俄语系勒索软件的生态系统
  20. 新手尝试编写微信小程序(1)——我的第一个微信小程序

热门文章

  1. 带有批注的Spring硒测试
  2. 使用Java VisualVM分析您的应用程序
  3. Shell(bash) 介绍
  4. 查看数据库 MySQL 的版本信息的命令语句
  5. android root权限函数,android 4.4下app永久获取root权限的方法
  6. c++ 提取傅里叶描述子_AI大语音(四)——MFCC特征提取(深度解析)
  7. aspose word 获取标题_Word干货|多级标题的自动编号怎么添加?
  8. exe打包工具哪个最好_为你的 Python 程序写个启动工具箱
  9. android 硬件对接,Android 对接硬件串口篇
  10. C语言#include还有些你不知道的事