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 26 Python
Python爬虫:通过关键字爬取百度图片
Feb 17 Python
Python面向对象编程基础解析(二)
Oct 26 Python
python range()函数取反序遍历sequence的方法
Jun 25 Python
python通过ffmgep从视频中抽帧的方法
Dec 05 Python
python获取服务器响应cookie的实例
Dec 28 Python
Python数据可视化库seaborn的使用总结
Jan 15 Python
Python里字典的基本用法(包括嵌套字典)
Feb 27 Python
PyQt QListWidget修改列表项item的行高方法
Jun 20 Python
python matplotlib imshow热图坐标替换/映射实例
Mar 14 Python
基于打开pycharm有带图片md文件卡死问题的解决
Apr 24 Python
python基于tkinter制作下班倒计时工具
Apr 28 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
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
PHP 爬取网页的主要方法
2018/07/13 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
JS获取并操作iframe中元素的方法
2013/03/21 Javascript
使用firebug进行调试javascript的示例
2013/12/16 Javascript
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
js电话号码验证方法
2015/09/28 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
一篇文章掌握RequireJS常用知识
2016/01/26 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
2017/07/20 Javascript
Webpack性能优化 DLL 用法详解
2017/08/10 Javascript
inner join 内联与left join 左联的实例代码
2017/09/18 Javascript
利用vue.js实现被选中状态的改变方法
2018/02/08 Javascript
vue.extend实现alert模态框弹窗组件
2018/04/28 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
防止Layui form表单重复提交的实现方法
2019/09/10 Javascript
VUE实现图片验证码功能
2020/11/18 Javascript
JavaScript实现随机点名程序
2020/03/25 Javascript
Python中使用haystack实现django全文检索搜索引擎功能
2017/08/26 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
印度领先的在线时尚商店:Koovs
2016/08/28 全球购物
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
Ancheer官方户外和运动商店:销售电动自行车
2019/08/07 全球购物
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
幼儿园小班教学反思
2014/02/02 职场文书
家长会主持词开场白
2014/03/18 职场文书
公司周年庆典策划方案
2014/05/17 职场文书
中学生社区服务活动报告
2015/02/05 职场文书
2015年第十五个全民国防教育日宣传活动方案
2015/05/06 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA