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下使用Psyco模块优化运行速度
Apr 05 Python
简单介绍Python中的try和finally和with方法
May 05 Python
Python实时获取cmd的输出
Dec 13 Python
分析经典Python开发工程师面试题
Apr 08 Python
Django中使用极验Geetest滑动验证码过程解析
Jul 31 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
Aug 20 Python
在Python中使用turtle绘制多个同心圆示例
Nov 23 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
Apr 13 Python
Python开发入门——迭代的基本使用
Sep 03 Python
pytorch实现ResNet结构的实例代码
May 17 Python
健身房被搭讪?用python写了个小米计时器助人为乐
Jun 08 Python
利用python进行数据加载
Jun 20 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
几种有用的变型 PHP中循环语句的用法介绍
2012/01/30 PHP
Symfony模板的快捷变量用法实例
2016/03/17 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
PHP微信公众号自动发送红包API
2016/06/01 PHP
php工具型代码之印章抠图
2018/07/18 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
js+CSS 图片等比缩小并垂直居中实现代码
2008/12/01 Javascript
实现连缀调用的map方法(prototype)
2009/08/05 Javascript
jquery ajax执行后台方法
2010/03/18 Javascript
jquery load()在firefox(火狐)下显示不正常的解决方法
2011/04/05 Javascript
js滚动条回到顶部的代码
2011/12/06 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
JavaScript语言对Unicode字符集的支持详解
2014/12/30 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
Bootstrap中表单控件状态(验证状态)
2016/08/04 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
js实现全选和全不选功能
2020/07/28 Javascript
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
python在多玩图片上下载妹子图的实现代码
2013/08/13 Python
Python脚本实现代码行数统计代码分享
2015/03/10 Python
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
简单谈谈Python中的json与pickle
2017/07/19 Python
Python json模块dumps、loads操作示例
2018/09/06 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
python实现递归查找某个路径下所有文件中的中文字符
2019/08/31 Python
python多线程并发及测试框架案例
2019/10/15 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
澳大利亚相机之家:Camera House
2017/11/30 全球购物
比利时买床:Beter Bed
2017/12/06 全球购物
小学生勤俭节约演讲稿
2014/08/28 职场文书
mysql批量新增和存储的方法实例
2021/04/07 MySQL
浅谈resultMap的用法及关联结果集映射
2021/06/30 Java/Android
教你部署vue项目到docker
2022/04/05 Vue.js
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android