父母结点表示树
数组索引号对应的值是该索引号的父母结点
例如:parent = [-1 0 0 0 1 1 3 3 2]数组表示的树为:
两种方法求该树的高度
方法一
此方法为简单方法,时间复杂度为:O(n^2),主要思路为:从索引号0开始,求对应索引号在树中的高度,取较大值,然后求索引号1的高度,取较大值,依次循环遍历所有的结点,即可得到树的高度。
python实现
# n为树的结点总数
def tree_height(parent, n):
max_Height = 0
for vertex in range(n):
height = 0
i = vertex
while i != -1
height += 1
# 回溯找父母结点,直至找到根节点才停止
i = parent[i]
max_Height = max(max_Height, height)
return max_Height
方法二
此方法比方法一要高效。时间复杂度为O(n)。主要思路:首先算出所有结点的高度,保存在的depth数组中,然后从数组中找出最大值即为该树的高度。
该算法比方法一高效的原因在于:方法二保存了所有结点的高度,也就是在求某一结点的高度时,它的父母结点的高度可以直接从数组中获得,不需要在从头回溯找父母节点
求索引号i的高度的步骤:
1.如果i是根结点,则depth[i] = 1
2.如果parent[i],也就是i的父母结点已经计算,则depth[i] = depth[parent[i]] + 1
3.如果parent[i],也就是i的父母结点没有计算,则递归找到父母结点,然后再给depth[i]赋值为:depth[i] = depth[parent[i]] + 1
python实现
# 计算某一结点的高度
def fill_Depth(parent, parent[i], depth):
if depth[i] != 0:
return
# 如果该结点为根结点
if parent[i] = -1:
depth[i] = 1
return
# 若该结点的父母结点的高度没有计算
if depth[parent[i]] == 0:
fill_Depth(parent, parent[i], depth)
depth[i] = depth[parent[i]] + 1
def findDepth(parent,n):
# 初始化depth数组
depth = [0 for i in range(n)]
for i in range(n):
fill_depth(parent, parent[i], depth)
max_Height = depth[0]
for i in range(1, n):
max_Height = max(max_Height, depth[i])
return max_Height