父母结点数组表示的树的高度

来源:互联网 发布:东方快车杀人事件知乎 编辑:程序博客网 时间:2024/04/30 10:03

父母结点表示树

数组索引号对应的值是该索引号的父母结点
例如: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]] + 1def 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
0 0
原创粉丝点击