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

父母结点表示树

数组索引号对应的值是该索引号的父母结点
例如: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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值