对于多叉树求两点之间的距离,最难的地方在于有没有思路,如何找到指定点的位置,以及如何去计算两个指定点之间的距离,下图是一个简单的的多叉树,从5到1的距离为2,从5到7的距离为4。

我们可以将求解两点之间的距离分为2个任务,第一个任务是寻找从root开始到指定点之间的路径第二个任务是找到公共祖先,并通过找到两点的公共祖先来计算两点之间的距离,代码如下

class Node(object):def __init__(self, value=0):self.value = valueself.children = []self.left = self.right = Nonedef get_path_length(root, path, k):# base case handlingif root is None:return Falsepath.append(root.value)if root.value == k:return Truefor child in root.children:if (child.children != None and get_path_length(child, path, k)):return True# 如果当前结点的值并不是kpath.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 = 0while i < len(path1) and i < len(path2):if path1[i] != path2[i]:breaki = i + 1# 减去重复计算的跟结点到lca部分即为结果return (len(path1) + len(path2) - 2 * i)else:return 0if __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:]]breakif child.children:for child_1 in child.children:if line[0] == child_1.value:child_1.children = [Node(x) for x in line[1:]]breakdist = 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二叉树求解两点之间距离的思路

python求多叉树任意两点之间的距离相关推荐

  1. C语言入门实战(2):求平面上任意两点之间的距离

    这是<C语言入门实战>系列的第2篇. 上一篇:C语言入门实战(1):准备开发环境.快速上手main()函数 下一篇:C语言入门实战(3):秒数转换为时:分:秒 文章目录 题目 提示 参考代 ...

  2. C语言试题八十四之求空间两点之间的距离

    1.题目 定义一个表示三维空间点坐标的结构类型,通过函数求空间上任意两点之间的距离. 2 .温馨提示 C语言试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中C程序设计科目.帮助C语言学者打好程 ...

  3. C语言求空间两点之间的距离

    定义一个表示三维空间点坐标的结构类型,通过函数求空间上任意两点之间的距离. 算法思想 空间内任意点的坐标有三个,分别为 x 轴方向.y 轴方向.z 轴方向,设定结构体 point,包括三个成员 x.y ...

  4. Java根据经纬度计算两点之间的距离

    1. 前言   在我们平时使用美团,饿了么等app进行订餐,或者使用猫眼进行订电影票的时候,都有一个距离的排序,表明该家店距离我们当前的位置,这种基于地理位置的服务,统一被称为LBS(Location ...

  5. Dijkstra最短路由算法,求任意两点之间的最短距离【Java】

    一.问题 求下图中节点0到节点5之间的最短距离 二.方法 Dijkstra最短路由算法.本文不再赘述,直接上代码,如果不懂,可以参考 文章 三.代码 public class MyDijkstra { ...

  6. c语言平曲线坐标,问题描述】给定平面任意两点的坐标(x1,y1)和(x2,y2),求这两点之间的距离(保留两位小数)。...

    问题描述]给定平面任意两点的坐标(x1,y1)和(x2,y2),求这两点之间的距离(保留两位小数).要求求距离的运算单独放在一个函数中,然后在main函数中调用..[输入形式]输入两点的坐标(x1,y ...

  7. 本题要求实现一个函数,对给定平面任意两点坐标(x1​,y1​)和(x2​,y2​),求这两点之间的距离。

    本题要求实现一个函数,对给定平面任意两点坐标(x1​,y1​)和(x2​,y2​),求这两点之间的距离. 函数接口定义: double dist( double x1, double y1, doub ...

  8. joj 2737 狼与羊的故事 求任意两点之间的必经之路

    村长要召开羊族大会,讨论羊族未来的发展,要求羊羊们到指定地点集合.小羊们收到通知后从家里出发到达指定地点.每个羊的家都是与其他羊的家连通的,可以互相访问. 比如说可以从1到3,同样也可以从3到1 .灰 ...

  9. matlab求两点间距离,matlab如何求一个N*2的矩阵的任意两点间的距离?

    matlab如何求一个N*2的矩阵的任意两点间的距离? mip版  关注:64  答案:3  悬赏:0 解决时间 2021-02-23 20:55 已解决 2021-02-23 16:37 假设有个矩 ...

最新文章

  1. Django用来作为爬虫框架浅谈
  2. php pdo获取查询数据_php使用PDO获取结果集的方法
  3. [翻译]你或许还未听说过的一些ASP.NET 2.0要诀
  4. java8并行流_Java 8:CompletableFuture与并行流
  5. 2018-05-05(在小程序中使用图标)
  6. mergesort_Mergesort算法的功能方法
  7. Java核心(四)你不知道的数据集合
  8. 腾讯移动分析+html5,FAQ · 腾讯移动分析 文档
  9. VMware windows server 2008配置dns服务
  10. oracle 参数类型 存储过程 获取_oracle Array类型作为参数传入函数(存储过程) 大字符串参数解决方案...
  11. 华为鸿蒙mate,华为MatePad Pro发布亮相!华为首款鸿蒙平板全新体验!
  12. AcWing 790 数的三次方根
  13. 树莓派用c语言pwm控制电机,树莓派学习笔记之PWM控制直流电机转速
  14. uos操作系统安装mysql
  15. html语言制作表格模板,十个最简单实用的Table设计模板
  16. JAVA:不使用第三个变量,交换两个变量的值
  17. android开发笔记之高级主题—传感器的简单介绍
  18. java rgb cmyk_Java CMYK图片转RGB图片(TwelveMonkeys方式)
  19. 8421BCD码加法的修正证明
  20. Google FCM推送集成及问题排查

热门文章

  1. LSTM时间序列预测MATLAB代码模板(无需调试)
  2. 梯度下降算法_Adam-一种随机优化算法
  3. modprobe ipmi_si报错问题
  4. EF 多对多关系 中间表操作
  5. 纯真数据库理解及根据IP定位地区
  6. php silk文件转换pcm,微信语音silk格式文件转换处理记录
  7. 使用OutputDebugString做调试输出
  8. const const
  9. 注意力机制+软阈值化 = 深度残差收缩网络(Deep Residual Shrinkage Network)
  10. OpenCV C++案例实战十八《抖音特效——“蓝线挑战”》