代码编织梦想

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

如果我们认为每个结点的子结点是无序的,那么得到的二叉树可能不唯一。

换句话说,每个结点可以选任意子结点作为左孩子,并按任意顺序连接右兄弟。

给定一棵包含 N 个结点的多叉树,结点从 1 至 N 编号,其中 1 号结点是根,每个结点的父结点的编号比自己的编号小。

请你计算其通过 “左孩子右兄弟” 表示法转化成的二叉树,高度最高是多少。

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

例如如下的多叉树:

QQ截图20210426100551.png

可能有以下 3 种 (这里只列出 3 种,并不是全部) 不同的 “左孩子右兄弟”表示:

QQ截图20210426100638.png

其中最后一种高度最高,为 4。

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

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

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

数据范围
对于 30% 的评测用例,1≤N≤20;
对于所有评测用例,1≤N≤105。

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

思路 :

  • 求树的高度从最下往上看动态规划,需要递归访问子树
  • 状态表示:f[u]表示以u为根结点的子树的最大高度
  • 状态计算:f[u] = max(f[u], f[v] + num[u])
    即,当前树的高度等于它 与 其子树的高度+以这个节点为根的儿子结点数量 取max
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e5 + 10;

int n;
int e[N], ne[N], h[N], idx;
int num[N], f[N];

void add(int u, int v) {
    e[idx] = v; ne[idx] = h[u]; h[u] = idx ++ ;
}
void dfs(int u) {
    for (int i = h[u]; ~i; i = ne[i]) {
        int j = e[i];
        dfs(j);
        f[u] = max(f[u], f[j] + num[u]);
    }
}

int main() {
    scanf("%d", &n);
    memset(h, -1, sizeof h);
    for (int i = 2, x; i <= n; ++ i) {
        scanf("%d", &x);
        add(x, i);
        num[x] ++ ;
    }
    dfs(1);
    printf("%d", f[1]);
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_51448653/article/details/128751630

任意有根树的左孩子右兄弟表示法存储-爱代码爱编程

算法导论:10.4-4 对一个含n个结点的任意有根树,写出一个O(n)时间的过程,输出其所有关键字。 该树以左孩子或兄弟表示法存储。 #ifndef _ROOTED_TREE_H_ #define _ROOTED_TREE_H_ /****************************************************

采用左孩子右兄弟结构实现森林-爱代码爱编程

森林也就是多棵树组合在一起,本文采用左孩子右兄弟结构实现 请一定看清,我说的是森林,不是树 请不要修改我的弹栈函数,那样写是有必要的 先说一下我的过程 要求如下: 1、 定义 左儿子 —右兄弟 链接存储 的树类和森林类。 2、 验证如下算法的正确性、各种功能及指标  :       1)创建 树和森林 ;       2)树和森林的先根遍历递归

左孩子右兄弟表示法的任意有根树的遍历-爱代码爱编程

算法导论 p.248 10.4-4 题目描述:对于一个含n个结点的任意有根树,写出一个O(n)时间的过程,输出其所有关键字,该树以左孩子右兄弟表示法存储。 与二叉树的遍历类似 树结构的定义:class Tree: def __init__(self, val): self.val = val self

【数据结构X.5】代码实现 树和森林的双亲表示法,左孩子右兄弟表示法,创建树的左孩子右兄弟二叉树以及二叉树到树的双亲表示法的转换思路和算法-爱代码爱编程

主题: 树和森林的双亲表示法,树的左孩子右兄弟表示法创建树的左孩子右兄弟二叉树二叉树到树的双亲表示法的转换思路和算法后续文章: 【数据结构】代码实现:左孩子右兄弟表示法转换为树的双亲表示法,左孩子右兄弟表示法转化为树的孩子兄弟链表表示法,树的双亲表示法转化为左孩子右兄弟的二叉树表示法 树和森林生成二叉树算法: 数据结构定义: 输入: 1

【数据结构X.6】代码实现:左孩子右兄弟表示法转换为树的双亲表示法,左孩子右兄弟表示法转化为树的孩子兄弟链表表示法,树的双亲表示法转化为左孩子右兄弟的二叉树表示法-爱代码爱编程

前文提要: 【数据结构】树、森林的双亲表示法,左孩子右兄弟表示法,创建树的左孩子右兄弟二叉树以及二叉树到树的双亲表示法的转换思路和算法 本文主题: 可执行代码和代码示例在最后。 【左孩子右兄弟】表示法转换为树的【双亲表示法】【左孩子右兄弟】表示法转化为树的【孩子兄弟】链表表示法树的【双亲表示法】转化为【左孩子右兄弟】的二叉树表示法其他的例如【孩子兄

多叉树(左孩子右兄弟)详细实现-爱代码爱编程

多叉树定义 有一个根节点多个孩子结点(不止2个孩子结点) 相比于二叉树,只需要写一个结构体,在结构体中添加parent,left,right就可以表示整颗树,但是多叉树有多个孩子结点,无法仅用左右孩子做到! 怎么做呢? 我们利用"左孩子""右兄弟"的定义方法实现多叉树! 我们仍然用一个结构体实现,结构体中仍然是parent

第十二届蓝桥杯 ——左孩子右兄弟-爱代码爱编程

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

蓝桥杯 试题 历届真题 左儿子右兄弟-爱代码爱编程

试题 历届真题 左孩子右兄弟 震惊:孩子居然是标题党的字。。。。CSDN不让标题有孩子。。 题目解释 资源限制 时间限制:1.0s 内存限制:256.0MB 题目可能乍看不是很懂。我先来把题目意思给说一下。(输入输出样例就不用我说了吧) 反正死死地按着左孩子有右兄弟的规则,尽可能地把这个树画长一点。 如果只有一个孩子,那好办,

蓝桥杯.左儿子右兄弟(DFS)-爱代码爱编程

Question: Solve: 首先存数据的问题: 利用STL的vector实现一个哈希表,用v[i]里的数据来存放以i作为父结点的子结点 问题的分析: 最优策略思考: 要想使树的高度最大,从每一层的角度开始考虑 先想右子树(兄弟结点),我这一层结点对右子树所能贡献的最大高度就是这一层结点的个数,不管他们的孩子,直接线性排列 接下来思

蓝桥杯2021年真题演练——7、 左hai子右兄弟(JavaA组)-爱代码爱编程

题目描述 题目解析 ⭐⭐首先要知道什么是“左孩子右兄弟”表示法,不然这个题是没法做的。 🌙通常来说,通过“左孩子右兄弟表示法”得到的二叉树树应该是唯一确定的,但如果规定孩子节点的顺序是无序的,那结果就千变万化了,比如测试样例中孩子节点"2",“3”,"4"的顺序不同也就生成了三种不同的二叉树,其中第三颗树的高度最大。题目即要求任意输入一棵树,得到它

蓝桥杯省赛2021 左子右兄弟python-爱代码爱编程

题目描述 对于一棵多叉树,我们可以通过 “左孩子右兄弟” 表示法,将其转化成一棵二叉树。 如果我们认为每个结点的子结点是无序的,那么得到的二叉树可能不唯一。 换句话说,每个结点可以选任意子结点作为左孩子,并按任意顺序连接右兄弟。 给定一棵包含 NN​​ 个结点的多叉树,结点从 11​​ 至 NN​ 编号,其中 11 号结点是根,每个结

蓝桥杯真题 左儿子右兄弟(图解、代码详解)-爱代码爱编程

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

普通树(双亲表示法存储)转二叉树【左孩子右兄弟表示法】_带带萌新jammy bear的博客-爱代码爱编程

本文对普通树采用顺序存储结构  图片来源:https://blog.csdn.net/weixin_44162361/article/details/118994573?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%A0%91%20%E8%96%9B%E5%AE%9

3422. 左孩子右兄弟-爱代码爱编程

Powered by:NEFU AB-IN Link 文章目录 3422. 左孩子右兄弟题意思路代码 3422. 左孩子右兄弟 题意 第十二届蓝桥杯省赛第一场C++A/C组,第十二届蓝桥杯省赛第一场