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抓取京东图书评论数据
Aug 31 Python
Python实现扫描局域网活动ip(扫描在线电脑)
Apr 28 Python
利用python代码写的12306订票代码
Dec 20 Python
Python中的条件判断语句基础学习教程
Feb 07 Python
用yum安装MySQLdb模块的步骤方法
Dec 15 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
Python发展史及网络爬虫
Jun 19 Python
django mysql数据库及图片上传接口详解
Jul 18 Python
Expected conditions模块使用方法汇总代码解析
Aug 13 Python
python-jwt用户认证食用教学的实现方法
Jan 19 Python
python自动生成sql语句的脚本
Feb 24 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/04/18 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
2013/06/21 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
php如何实现数据库的备份和恢复
2020/11/30 PHP
Javascript实例教程(19) 使用HoTMetal(7)
2006/12/23 Javascript
详谈 Jquery Ajax异步处理Json数据.
2011/09/09 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
2014/04/12 Javascript
原生javascript实现图片按钮切换
2015/01/12 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
jQuery页面弹出框实现文件上传
2017/02/09 Javascript
原生JS实现多个小球碰撞反弹效果示例
2018/01/31 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
vue 兄弟组件的信息传递的方法实例详解
2019/08/30 Javascript
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
使用优化器来提升Python程序的执行效率的教程
2015/04/02 Python
Python 转义字符详细介绍
2017/03/21 Python
Python 绘图库 Matplotlib 入门教程
2018/04/19 Python
python实现抖音视频批量下载
2018/06/20 Python
pandas分别写入excel的不同sheet方法
2018/12/11 Python
Python进阶之全面解读高级特性之切片
2019/02/19 Python
Django Rest framework认证组件详细用法
2019/07/25 Python
Python使用ElementTree美化XML格式的操作
2020/03/06 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
万年牢教学反思
2014/02/15 职场文书
设计专业自荐信
2014/06/19 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
vue使用v-model进行跨组件绑定的基本实现方法
2021/04/28 Vue.js
PHP获取学生成绩的方法
2021/11/17 PHP