蓝桥杯-左son右兄弟(python-dfs)

该博客讨论了如何将一棵多叉树通过‘左孩子右兄弟’表示法转化为二叉树,并求解转化后二叉树的最大高度。文章提供了具体的输入输出示例,解释了思路和解决方案,并给出了Python代码实现。代码中利用递归计算每个节点的最大高度,以确定整个树的最大高度。注意在实际运行时需要设置递归深度限制以避免超出范围。
摘要由CSDN通过智能技术生成

一、题目

题目 2606: 蓝桥杯2021年第十二届省赛真题-左孩子右兄弟
时间限制: 1Sec 内存限制: 128MB 提交: 866 解决: 287
题目描述
对于一棵多叉树,我们可以通过 “左孩子右兄弟” 表示法,将其转化成一棵
二叉树。
如果我们认为每个结点的子结点是无序的,那么得到的二叉树可能不唯一。换句话说,每个结点可以选任意子结点作为左孩子,并按任意顺序连接右兄弟。
给定一棵包含 N 个结点的多叉树,结点从 1 至 N 编号,其中 1 号结点是根,每个结点的父结点的编号比自己的编号小。请你计算其通过 “左孩子右兄弟” 表示法转化成的二叉树,高度最高是多少。注:只有根结点这一个结点的树高度为 0 。
例如如下的多叉树:
在这里插入图片描述

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

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

输入
输入的第一行包含一个整数 N。
以下 N 1 行,每行包含一个整数,依次表示 2 至 N 号结点的父结点编号。
输出
输出一个整数表示答案。
样例输入

5
1
1
1
2

样例输出

4

二、思路和代码

思路:
一个树的最高高度情况为所有子节点都依次排在左子树时(如下图最后一个树,4,3,2为1的孩子都排在左子树,而2是最高的左子树,排最下)而最高高度的子节点排在左子树的最下层。代码有详细注释。
在这里插入图片描述

技巧:
要把sys的setrecursionlimit设大一点不然在蓝桥杯官网会超过递归深度!(离谱的问题,建议比赛的时候都设大一点)

代码:

import sys

sys.setrecursionlimit(100000)
N = int(input())
# 下标结点,tree[i][0]为其父节点,其余为孩子结点
tree = [[-1] for _ in range(N+1)]
for i in range(2, N+1):
    fa = int(input().strip())
    tree[i][0] = fa
    tree[fa].append(i)


def getHigh(node):
    # 叶子结点
    if len(tree[node]) == 1:
        # dp[node] = 0
        return 0
    # 最高高度为其孩子结点数+最高的孩子树的高度
    # 求最高孩子树高度
    maxhigh = 0
    for j in range(1, len(tree[node])):
        maxhigh = max(maxhigh, getHigh(tree[node][j]))
    return len(tree[node])-1+maxhigh


print(getHigh(1))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值