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实现配置文件备份的方法
Jul 30 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
Feb 11 Python
python批量设置多个Excel文件页眉页脚的脚本
Mar 14 Python
Flask框架通过Flask_login实现用户登录功能示例
Jul 17 Python
django进阶之cookie和session的使用示例
Aug 17 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
Apr 03 Python
使用python爬取抖音视频列表信息
Jul 15 Python
Django项目主urls导入应用中views的红线问题解决
Aug 10 Python
使用python无账号无限制获取企查查信息的实例代码
Apr 17 Python
Python可视化工具如何实现动态图表
Oct 23 Python
python绘图模块之利用turtle画图
Feb 12 Python
Python爬虫基础讲解之请求
May 13 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实现批量生成App各种尺寸Logo
2015/03/19 PHP
文件上传之SWFUpload插件(代码)
2015/07/30 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
2015/11/18 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
JS判断对象是否存在的10种方法总结
2013/12/23 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
BootStrap的table表头固定tbody滚动的实例代码
2016/08/24 Javascript
JavaScript实现DOM对象选择器
2016/09/24 Javascript
Javascript blur与click冲突解决办法
2017/01/09 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
浅谈原型对象的常用开发模式
2017/07/22 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
[38:23]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第一场
2014/05/24 DOTA
tornado捕获和处理404错误的方法
2014/02/26 Python
python+selenium识别验证码并登录的示例代码
2017/12/21 Python
python Crypto模块的安装与使用方法
2017/12/21 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
2018/06/05 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
Python爬虫破解登陆哔哩哔哩的方法
2020/11/17 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
美国最受欢迎的童装品牌之一:The Children’s Place
2016/07/23 全球购物
铁路安全事故反思
2014/04/26 职场文书
2014年个人委托书范本
2014/10/13 职场文书
接待员岗位职责
2015/02/13 职场文书
小学教师岗位职责
2015/04/02 职场文书
2016高考冲刺决心书
2015/09/23 职场文书
《百分数的认识》教学反思
2016/02/19 职场文书
JavaScript实现班级抽签小程序
2021/05/19 Javascript
一篇文章搞懂python混乱的切换操作与优雅的推导式
2021/08/23 Python