python求多叉树任意两点之间的距离

对于多叉树求两点之间的距离,最难的地方在于有没有思路,如何找到指定点的位置,以及如何去计算两个指定点之间的距离,下图是一个简单的的多叉树,从5到1的距离为2,从5到7的距离为4。
在这里插入图片描述
我们可以将求解两点之间的距离分为2个任务,第一个任务是寻找从root开始到指定点之间的路径第二个任务是找到公共祖先,并通过找到两点的公共祖先来计算两点之间的距离,代码如下

class Node(object):
    def __init__(self, value=0):
        self.value = value
        self.children = []
        self.left = self.right = None


def get_path_length(root, path, k):
    # base case handling
    if root is None:
        return False
    path.append(root.value)
    if root.value == k:
        return True
    for child in root.children:
        if (child.children != None and get_path_length(child, path, k)):
            return True
    # 如果当前结点的值并不是k
    path.pop()
    return False
def find_distance(root, n1, n2):
    if root:
        # 获取第一个结点的路径(存储跟结点到i)
        path1 = []
        get_path_length(root, path1, n1)
        # 获取第二个结点的路径
        path2 = []
        get_path_length(root, path2, n2)
        # 找到它们的公共祖先
        i = 0
        while i < len(path1) and i < len(path2):
            if path1[i] != path2[i]:
                break
            i = i + 1
        # 减去重复计算的跟结点到lca部分即为结果
        return (len(path1) + len(path2) - 2 * i)
    else:
        return 0


if __name__ == '__main__':
    with open(r'D:\PekingInfoResearch\HiAGM_new\data\rcv1.taxonomy', 'r', encoding='utf-8') as f:
        first_line = f.readline()
        root = Node(first_line.split()[0])
        root.children = [Node(x) for x in first_line.split()[1:]]
        for line in f:
            line = line.split()
            for child in root.children:
                if line[0] == child.value:
                    child.children = [Node(x) for x in line[1:]]
                    break
                if child.children:
                    for child_1 in child.children:
                        if line[0] == child_1.value:
                            child_1.children = [Node(x) for x in line[1:]]
                            break

    dist = find_distance(root, 'C41', 'G15')
    print("Distance between node {} & {}: {}".format('C41', 'G15', dist))

rcv1.taxonomy

Root	CCAT	ECAT	GCAT	MCAT
CCAT	C11	C12	C13	C14	C15	C16	C17	C18	C21	C22	C23	C24	C31	C32	C33	C34	C41	C42
C15	C151	C152
C151	C1511
C17	C171	C172	C173	C174
C18	C181	C182	C183
C31	C311	C312	C313
C33	C331
C41	C411
ECAT	E11	E12	E13	E14	E21	E31	E41	E51	E61	E71
E12	E121
E13	E131	E132
E14	E141	E142	E143
E21	E211	E212
E31	E311	E312	E313
E41	E411
E51	E511	E512	E513
GCAT	G15	GCRIM	GDEF	GDIP	GDIS	GENT	GENV	GFAS	GHEA	GJOB	GMIL	GOBIT	GODD	GPOL	GPRO	GREL	GSCI	GSPO	GTOUR	GVIO	GVOTE	GWEA	GWELF
G15	G151	G152	G153	G154	G155	G156	G157	G158	G159
MCAT	M11	M12	M13	M14
M13	M131	M132
M14	M141	M142	M143

感谢banananana提供的python二叉树求解两点之间距离的思路

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值