思路:
左孩子右兄弟,意思就是父节点的孩子选择第一个作为左孩子,其他的孩子作为第一个孩子的右孩子依次线性连接
所以此时的高度就是父节点所有孩子的个数(不考虑孩子的孩子数)
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))