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共存的配置方法
May 22 Python
Python生成8位随机字符串的方法分析
Dec 05 Python
python模块之paramiko实例代码
Jan 31 Python
Python3.7中安装openCV库的方法
Jul 11 Python
详解django中使用定时任务的方法
Sep 27 Python
python整合ffmpeg实现视频文件的批量转换
May 31 Python
python基于plotly实现画饼状图代码实例
Dec 16 Python
Python json模块与jsonpath模块区别详解
Mar 05 Python
Python Django中间件使用原理及流程分析
Jun 13 Python
基于pytorch中的Sequential用法说明
Jun 24 Python
解决Pymongo insert时会自动添加_id的问题
Dec 05 Python
Python 可视化神器Plotly详解
Dec 26 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 远程关机操作的代码
2008/12/05 PHP
10条PHP高级技巧[修正版]
2011/08/02 PHP
PHP无刷新上传文件实现代码
2011/09/19 PHP
PHP+shell实现多线程的方法
2015/07/01 PHP
PHP文件缓存smarty模板应用实例分析
2016/02/26 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
PHP构造二叉树算法示例
2017/06/21 PHP
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
Js中的onblur和onfocus事件应用介绍
2013/08/27 Javascript
禁用JavaScript控制台调试的方法
2014/03/07 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
Javascript简单实现面向对象编程继承实例代码
2015/11/27 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
JavaScript数组方法大全(推荐)
2016/07/05 Javascript
Javascript动画效果(2)
2016/10/11 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
Python函数中定义参数的四种方式
2014/11/30 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
Python爬虫之UserAgent的使用实例
2019/02/21 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
会计稽核岗位职责
2015/04/13 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
六年级情感作文之500字
2019/10/23 职场文书
Oracle用户管理及赋权
2022/04/24 Oracle