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程序设计入门(1)基本语法简介
Jun 13 Python
Python通过递归遍历出集合中所有元素的方法
Feb 25 Python
python监控网站运行异常并发送邮件的方法
Mar 13 Python
python统计日志ip访问数的方法
Jul 06 Python
Python实现自动登录百度空间的方法
Jun 10 Python
Numpy数组的保存与读取方法
Apr 04 Python
基于Python列表解析(列表推导式)
Jun 23 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
python 同时读取多个文件的例子
Jul 16 Python
python 爬取学信网登录页面的例子
Aug 13 Python
Python可视化工具如何实现动态图表
Oct 23 Python
Pytorch DataLoader shuffle验证方式
Jun 02 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实现图象锐化代码
2007/06/14 PHP
UCenter Home二次开发指南
2009/05/28 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
Javascript和Ajax中文乱码吐血版解决方案
2009/12/21 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
2015/08/25 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
Vue.js2.0中的变化小结
2017/10/24 Javascript
JS+CSS实现滚动数字时钟效果
2017/12/25 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
2018/03/26 Javascript
VueQuillEditor富文本上传图片(非base64)
2020/06/03 Javascript
python encode和decode的妙用
2009/09/02 Python
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
对numpy 数组和矩阵的乘法的进一步理解
2018/04/04 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
python and or用法详解
2019/06/26 Python
python异常处理try except过程解析
2020/02/03 Python
python 简单的调用有道翻译
2020/11/25 Python
移动端开发HTML5页面点击按钮后出现闪烁或黑色背景的解决办法
2018/09/19 HTML / CSS
美国网上花店:JustFlowers
2017/02/12 全球购物
windeln官方海外旗舰店:德淘超人气母婴超市
2017/12/15 全球购物
草莓网官网:StrawberryNET
2019/08/21 全球购物
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
药学职务聘任书
2014/03/29 职场文书
研讨会主持词
2014/04/02 职场文书
房屋出租协议书
2014/04/10 职场文书
党员民主评议自我评价
2014/10/20 职场文书
2015教师年度考核评语
2015/03/25 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电
四十九个javascript小知识实用技巧
2021/11/20 Javascript
Mysql中有关Datetime和Timestamp的使用总结
2021/12/06 MySQL