左孩子右兄弟(Java详解)

目录

一、题目描述

二、题解


一、题目描述

对于一棵多叉树,我们可以通过“左孩子右兄弟” 表示法,将其转化成一棵二叉树。
如果我们认为每个结点的子结点是无序的,那么得到的二叉树可能不唯一。
换句话说,每个结点可以选任意子结点作为左孩子,并按任意顺序连接右兄弟。
给定一棵包含N 个结点的多叉树,结点从1 至N 编号,其中1 号结点是根,每个结点的父结点的编号比自己的编号小。
请你计算其通过“左孩子右兄弟” 表示法转化成的二叉树,高度最高是多少。
注:只有根结点这一个结点的树高度为0 。

输入描述:

输入的第一行包含一个整数N。以下N-1行,每行包含一个整数,依次表示2至N号节点的父节点编号。

输出描述:

输出一个整数表示答案。

示例:

输入:

5

1

1

2

输出:

4

二、题解

思路分析:

(1)如何将多叉树转换为二叉树?

根据题目描述,通过“左孩子右兄弟”表示法进行转换,即节点node的孩子节点为node的左孩子,node的兄弟为node的右孩子

(2)如何使得转换后的二叉树高度最大?

题目要求我们求得转换后的二叉树的最大高度,由于每个结点可以选任意子结点作为左孩子,并按任意顺序连接右兄弟。因此,我们需要找出高度更大的选择方式,通过画图分析,我们可以发现:选择孩子节点最多的兄弟节点作为尾节点,可以使二叉树的深度最大

(3)如何求最大高度?

按照(2)中的思路和上图分析,我们可以发现:

一个节点的最大高度 = 其孩子节点的个数 + 其孩子节点的最大高度,

因此,我们可以通过递归的方式来求出二叉树的最大高度

二叉树的最大高度 = 根节点的孩子节点数 + 其孩子节点的最大高度

而递归的出口则是 节点node的孩子节点个数为0

实现步骤:

(1)定义一个ArrayList类型的数组,用于存放当前节点及其孩子节点,类似于邻接表

代码实现: 

public class Main {
    //定义一个ArrayList类型的数组,ArrayList中存放的是Integer类型的元素(当前节点的孩子节点)
    //由于递归时要访问数组中的元素(通过数组找到当前节点),因此不能将数组定义为局部变量,
    // 而应该定义为成员变量
    public static ArrayList<Integer>[] lists;
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int n = scan.nextInt();
        //创建数组
        lists = new ArrayList[n+1];
        for (int i = 0; i < n+1; i++) {
            lists[i] = new ArrayList<>();
        }
        //存入孩子节点
        for (int i = 2; i <= n; i++) {
            int node = scan.nextInt();
            lists[node].add(i);//存储该节点的字节点
        }
        scan.close();
}

(2)通过递归的方式求二叉树的最大高度

若前节点node的孩子节点个数为0,则递归结束

若不为0,则遍历Arraylsit,分别求得其孩子节点的最大高度,并找出其最大值

节点的最大高度为node的孩子节点个数 + 孩子节点的最大高度

代码实现:

//利用递归求树的最大高度
public static int dsf(int node){
   int count = 0;
    //孩子节点的个数
   int size = lists[node].size();
   if(size == 0){
       return 0;
   }
    //若有孩子节点,则遍历孩子节点,找到孩子节点的最大高度
    for (int i = 0; i < size; i++) {
        count = Math.max(count,dsf(lists[node].get(i)));
    }
    return count+size;
}

完整代码:

import java.util.ArrayList;
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
  //定义ArrayList类型的数组,ArrayList中存放的是Integer类型的元素
    public static ArrayList<Integer>[] lists;
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int n = scan.nextInt();
        lists = new ArrayList[n+1];
        for (int i = 0; i < n+1; i++) {
            lists[i] = new ArrayList<Integer>();
        }
        for (int i = 2; i <= n; i++) {
            int node = scan.nextInt();
            lists[node].add(i);//存储该节点的孩子节点
        }
        int count = dsf(1);
        System.out.println(count);
        scan.close();
    }

    //利用递归求树的最大高度
    public static int dsf(int node){
       int count = 0;
       //孩子节点的个数
       int size = lists[node].size();
       if(size == 0){
           return 0;
       }
       //若有孩子节点,则遍历孩子节点,找到孩子节点的最大高度
        for(int i = 0; i < size; i++) {
            count = Math.max(count,dsf(lists[node].get(i)));
        }
        return count+lists[node].size();
    }
}

题目来自:

左孩子右兄弟 - 蓝桥云课 (lanqiao.cn) 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文导读 | 10月专题内容精选:人的预测

编者按 本次论文导读&#xff0c;编者选择了10月份OR和MS上与"人的预测"有关的三篇文章&#xff0c;分别涉及群体智慧的提取&#xff0c;个体序列预测的评估&#xff0c;以及决策者对风险的扭曲感知在分布式鲁棒优化中的应用。其中&#xff0c;从基于"生成式可能…

红队攻防实战之从边界突破到漫游内网(无cs和msf)

也许有一天我们再相逢&#xff0c;睁大眼睛看清楚&#xff0c;我才是英雄。 本文首发于先知社区&#xff0c;原创作者即是本人 本篇文章目录 网络拓扑图&#xff1a; 本次红队攻防实战所需绘制的拓扑图如下&#xff1a; 边界突破 访问网站&#xff1a; http://xxx.xxx.xxx…

Flink 常用物理分区算子(Physical Partitioning)

Flink 物理分区算子(Physical Partitioning) 在Flink中&#xff0c;常见的物理分区策略有&#xff1a;随机分配(Random)、轮询分配(Round-Robin)、重缩放(Rescale)和广播(Broadcast)。 接下来&#xff0c;我们通过源码和Demo分别了解每种物理分区算子的作用和区别。 (1) 随机…

2024北京林业大学计算机考研分析

24计算机考研|上岸指南 北京林业大学 特色优势 Characteristics & Advantages&#xff1a;信息学院创建于2001年&#xff0c;是一个年轻而有朝气的学院。学院秉承“结构、特色、质量、创新”的八字方针&#xff0c;坚持以“质量提升、行业融合”为核心的内涵式发展战略&am…

Pycharm创建项目新环境,安装Pytorch

在python项目中&#xff0c;很多项目使用的各类包的版本是不一致的。所以我们可以对每个项目有专属于它的环境。所以这个文章就是教你如何创建新环境。 一、创建新环境 首先我们需要去官网下载conda。然后在Pycharm下面添加conda的可执行文件。 用conda创建新环境。 二、…

libmosquitto库的一个bug,任务消息id(mid)分配后不起作用

代码如图所示: 当订阅了所有主题后,每个主题的mid是他们的下标索引加100的数字,可是实际打印出来的值是: mid依然是1,2,这个参数在这里失效了,不知道是bug还是mqtt的什么机制?

Python之Pygame游戏编程详解

一、介绍 1.1 定义 Pygame是一种流行的Python游戏开发库&#xff0c;它提供了许多功能&#xff0c;使开发人员可以轻松创建2D游戏。它具有良好的跨平台支持&#xff0c;可以在多个操作系统上运行&#xff0c;例如Windows&#xff0c;MacOS和Linux。在本文中&#xff0c;我们将…

Linux后台运行Python的py文件,如何使ssh工具退出后仍能运行

常规运行 python3 mysqlbak.py ssh工具退出后&#xff0c;或ctrlc中断后&#xff0c;程序将不在运行 后台运行 nohup python3 mysqlbak.py > mysqlbak.log & > mysqlbak.log为可选项&#xff0c;输出日志到指定文件&#xff0c;如果不写&#xff0c;输出日志到nohup…

【Seata源码学习 】篇四 TM事务管理器是如何开启全局事务

TM发送 单个或批量 消息 以发送GlobalBeginRequest消息为例 TM在执行拦截器链路前将向TC发送GlobalBeginRequest 消息 io.seata.tm.api.DefaultGlobalTransaction#begin(int, java.lang.String) Overridepublic String begin(String applicationId, String transactionServi…

网络安全工程师究竟是什么?怎么入门?

首先啊骚年们我们必须先了解网络安全这个行业究竟是干啥的。 是打ctf的&#xff1f;一个个都像韩商言吴白那么帅刷刷敲几个代码就能轻易夺旗&#xff1f; 还是像十大黑客之一的米特尼克一样闯入了“北美空中防务指挥系统”的计算机主机内&#xff0c;还在被通缉逃跑期间控制了…

鸿蒙原生应用/元服务开发-AGC分发如何上架HarmonyOS应用

一、上架整体流程 二、上架HarmonyOS应用 获取到HarmonyOS应用软件包后&#xff0c;开发者可将应用提交至AGC申请上架。上架成功后&#xff0c;用户即可在华为应用市场搜索获取开发者的HarmonyOS应用。 配置应用信息 1.登录AppGallery Connect&#xff0c;选择“我的应用”。…

最重要的BI测试-适用于任何BI和分析平台

为什么 BI 测试是答案 相信你的数据可视化是成功执行商业智能 (BI) 和分析项目的关键因素。我敢肯定&#xff0c;你遇到过以下情况&#xff1a;业务主管或业务用户反馈说他们的分析看起来不对&#xff0c;他们的 KPI 看起来有问题&#xff0c;或者速度太慢而无法使用。要问自己…

Spring框架学习 -- Bean的生命周期和作用域

目录 前言 案例 案例分析 作用域的定义 Bean对象的6种作用域 Singleton prototype 设置作用域 ​编辑延迟初始化 Spring的执行流程 Bean的生命周期 前言 我们可以类比一下普通变量的生命周期和作用域, 大多数变量的生命周期和作用域都被限定在了花括号内 {}, 除…

贝锐花生壳:无需公网IP、简单3步,远程访问群晖NAS

面对NAS远程访问难题&#xff0c;贝锐花生壳一招搞定&#xff01;并且无需公网IP、简单3步&#xff0c;即可实现固定域名远程访问NAS。 步骤1&#xff1a; 目前&#xff0c;群晖NAS已在套件中心内置花生壳客户端。 浏览器进入群晖NAS的DSM管理界面&#xff0c;点击【套件中心】…

SSM大学生社团信息管理系统-99953,(免费领取源码)计算机毕业设计选题开题+程序定制+论文书写+答辩ppt书写 包售后 全流程

SSM大学生社团信息管理系统APP 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;高校当然也不能排除在外。大学生社团信息管理系统APP是以实际运用为开发背景&#xff0c…

[Python程序打包: 使用PyInstaller制作单文件exe以及打包GUI程序详解]

文章目录 概要Python 程序打包—使用 Pyinstaller 打包 exePython程序打包—使用Pyinstaller打包GUI程序Python程序打包—使用 Pyinstaller 设置 exe 图标小结 概要 使用PyInstaller工具将Python程序打包成可执行&#xff08;EXE&#xff09;文件。将Python程序打包成EXE的好处…

unittest指南——不拼花哨,只拼实用

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

看完就会,从抓包到接口测试的全过程解析【1500字保姆级教程】

一、为什么抓包 1、从功能测试角度 通过抓包查看隐藏字段 Web 表单中会有很多隐藏的字段&#xff0c;这些隐藏字段一般都有一些特殊的用途&#xff0c;比如收集用户的数据&#xff0c;预防 CRSF 攻击&#xff0c;防网络爬虫&#xff0c;以及一些其他用途。这些隐藏字段在界面…

从裸机启动开始运行一个C++程序(十四)

前序文章请看&#xff1a; 从裸机启动开始运行一个C程序&#xff08;十三&#xff09; 从裸机启动开始运行一个C程序&#xff08;十二&#xff09; 从裸机启动开始运行一个C程序&#xff08;十一&#xff09; 从裸机启动开始运行一个C程序&#xff08;十&#xff09; 从裸机启动…

socket can中是如何根据 结构体can_bittiming_const中的字段 计算bitrate的?

在 SocketCAN 中&#xff0c;can_bittiming_const 结构体用于表示 CAN 总线的定时参数&#xff0c;包括位率&#xff08;bitrate&#xff09;的计算。can_bittiming_const 包含了许多与位率相关的参数&#xff0c;其中一些参数用于计算实际的位率。 下面是一些与位率计算相关的…