Python实现的多叉树寻找最短路径算法示例


Posted in Python onJuly 30, 2018

本文实例讲述了Python实现的多叉树寻找最短路径算法。分享给大家供大家参考,具体如下:

多叉树的最短路径:

思想:

    传入start 和 end 两个 目标值
    1 找到从根节点到目标节点的路径
    2 从所在路径,寻找最近的公共祖先节点,
    3 对最近公共祖先根节点 拼接路径

Python代码:

# -*- coding:utf-8 -*-
import copy
#节点数据结构
class Node(object):
  # 初始化一个节点
  def __init__(self,value = None):
    self.value = value # 节点值
    self.child_list = []  # 子节点列表
  # 添加一个孩子节点
  def add_child(self,node):
    self.child_list.append(node)
# 初始化一颗测试二叉树
def init():
  '''
  初始化一颗测试二叉树:
      A
    B  C  D
   EFG    HIJ
  '''
  root = Node('A')
  B = Node('B')
  root.add_child(B)
  root.add_child(Node('C'))
  D = Node('D')
  root.add_child(D)
  B.add_child(Node('E'))
  B.add_child(Node('F'))
  B.add_child(Node('G'))
  D.add_child(Node('H'))
  D.add_child(Node('I'))
  D.add_child(Node('J'))
  return root
# 深度优先查找 返回从根节点到目标节点的路径
def deep_first_search(cur,val,path=[]):
  path.append(cur.value) # 当前节点值添加路径列表
  if cur.value == val:  # 如果找到目标 返回路径列表
    return path
  if cur.child_list == []:  # 如果没有孩子列表 就 返回 no 回溯标记
    return 'no'
  for node in cur.child_list: # 对孩子列表里的每个孩子 进行递归
    t_path = copy.deepcopy(path)  # 深拷贝当前路径列表
    res = deep_first_search(node,val,t_path)
    if res == 'no': # 如果返回no,说明找到头 没找到 利用临时路径继续找下一个孩子节点
      continue
    else :
      return res # 如果返回的不是no 说明 找到了路径
  return 'no' # 如果所有孩子都没找到 则 回溯
# 获取最短路径 传入两个节点值,返回结果
def get_shortest_path( start,end ):
  # 分别获取 从根节点 到start 和end 的路径列表,如果没有目标节点 就返回no
  path1 = deep_first_search(root, start, [])
  path2 = deep_first_search(root, end, [])
  if path1 == 'no' or path2 == 'no':
    return '无穷大','无节点'
  # 对两个路径 从尾巴开始向头 找到最近的公共根节点,合并根节点
  len1,len2 = len(path1),len(path2)
  for i in range(len1-1,-1,-1):
    if path1[i] in path2:
      index = path2.index(path1[i])
      path2 = path2[index:]
      path1 = path1[-1:i:-1]
      break
  res = path1+path2
  length = len(res)
  path = '->'.join(res)
  return '%s:%s'%(length,path)
# 主函数、程序入口
if __name__ == '__main__':
  root = init()
  res = get_shortest_path('F','I')
  print(res)

运行结果:

5:F->B->A->D->I

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
用Python实现一个简单的线程池
Apr 07 Python
Python3操作SQL Server数据库(实例讲解)
Oct 21 Python
Sublime开发python程序的示例代码
Jan 24 Python
Python二叉树定义与遍历方法实例分析
May 25 Python
Python3实现的简单工资管理系统示例
Mar 12 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
May 04 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
Dec 13 Python
python离线安装外部依赖包的实现
Feb 13 Python
python实现最速下降法
Mar 24 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
Jun 28 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 Python
Python first-order-model实现让照片动起来
Jun 25 Python
tensorflow: variable的值与variable.read_value()的值区别详解
Jul 30 #Python
Tensorflow 实现修改张量特定元素的值方法
Jul 30 #Python
python用BeautifulSoup库简单爬虫实例分析
Jul 30 #Python
对TensorFlow的assign赋值用法详解
Jul 30 #Python
Python双向循环链表实现方法分析
Jul 30 #Python
tensorflow更改变量的值实例
Jul 30 #Python
Python使用分布式锁的代码演示示例
Jul 30 #Python
You might like
Ubuntu中搭建Nginx、PHP环境最简单的方法
2015/03/05 PHP
php中static和const关键字用法分析
2016/12/07 PHP
如何实现浏览器上的右键菜单
2006/07/10 Javascript
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
微信小程序 九宫格实例代码
2017/01/21 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
Python列表list数组array用法实例解析
2014/10/28 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
Python中的random.uniform()函数教程与实例解析
2019/03/02 Python
python使用tomorrow实现多线程的例子
2019/07/20 Python
python 深度学习中的4种激活函数
2020/09/18 Python
python与idea的集成的实现
2020/11/20 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
Python3.9.1中使用split()的处理方法(推荐)
2021/02/07 Python
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
英语翻译系毕业生求职信
2013/09/29 职场文书
给面试官的感谢信
2014/02/01 职场文书
教师先进工作者事迹材料
2014/05/01 职场文书
热爱祖国的演讲稿
2014/05/04 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
四风对照检查剖析材料
2014/10/07 职场文书
2015年社会实践个人总结
2015/03/06 职场文书
卫生主题班会
2015/08/14 职场文书
pytorch 如何使用batch训练lstm网络
2021/05/28 Python
Python requests用法和django后台处理详解
2022/03/19 Python
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫