蓝桥-左孩子右兄弟 python

本文介绍了如何在蓝桥杯竞赛中处理左孩子右兄弟树结构问题,通过深度优先搜索(DFS)计算树的高度,同时处理可能的递归深度限制,确保在N<100000的情况下有效解决。
摘要由CSDN通过智能技术生成

 

 

思路:

 左孩子右兄弟,意思就是父节点的孩子选择第一个作为左孩子,其他的孩子作为第一个孩子的右孩子依次线性连接

所以此时的高度就是父节点所有孩子的个数(不考虑孩子的孩子数)

1.由于子节点的右边只能放根节点的子结点,子节点的左边是子节点的孩子结点,所以把高度最高的子节点放在最后会是最优的选择。例如题目中的第一个图,2放在第一个,显然浪费了5结点,而图3把2放在最后一个,没有浪费5结点。

2.得出方程 根节点的高度h= 根结点的子结点个数+max(子节点的高度,也就是子节点的孩子个数)

->所以可以用dfs来解决问题,dfs(1)=len(chird)+max(dfs(2),dfs(3),dfs(4),dfs(5)......)

注意情况:

由于N<100000 ,可能会出现递归过深的情况

所以需要加入sys.setrecursionlimit()

Python中的sys.setrecursionlimit()函数用于设置递归调用的最大深度。默认情况下,Python的递归深度限制为1000。

n=int(input())
h=  [ [] for i in range(n+1)]
import sys
sys.setrecursionlimit(10000)

class tree:
    def __init__(self,fa):
        self.next=fa
for i in range(2,n+1):
    m=int(input())
    h[m].append(tree(i))


def dfs(n):
    arr=[0,0]
    for ele in h[n]:
        arr.append(dfs(ele.next))
    return len(h[n])+max(arr)


print(dfs(1))

图源:蓝桥杯 试题 历届真题 左儿子右兄弟_蓝桥杯左孩子-CSDN博客

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值