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下实现的RSA加密/解密及签名/验证功能示例
Jul 17 Python
django rest framework之请求与响应(详解)
Nov 06 Python
Python冲顶大会 快来答题!
Jan 17 Python
儿童编程python入门
May 08 Python
Python 隐藏输入密码时屏幕回显的实例
Feb 19 Python
基于Python批量生成指定尺寸缩略图代码实例
Nov 20 Python
python读取图片的几种方式及图像宽和高的存储顺序
Feb 11 Python
解决Tensorboard 不显示计算图graph的问题
Feb 15 Python
Python面向对象魔法方法和单例模块代码实例
Mar 25 Python
在python里创建一个任务(Task)实例
Apr 25 Python
关于Keras Dense层整理
May 21 Python
python实现网页录音效果
Oct 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
使用NetBeans + Xdebug调试PHP程序的方法
2011/04/12 PHP
php实现singleton()单例模式实例
2014/11/06 PHP
PHP超全局数组(Superglobals)介绍
2015/07/01 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
JavaScript中的变量声明早于赋值分析
2012/03/01 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
jQuery中element选择器用法实例
2014/12/29 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
2016/07/27 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
token 机制和实现方式
2020/12/15 Javascript
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
python计算对角线有理函数插值的方法
2015/05/07 Python
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
python单例设计模式实现解析
2020/01/07 Python
纯CSS实现聊天框小尖角、气泡效果
2014/04/04 HTML / CSS
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
内部类的定义、种类以及优点
2013/10/16 面试题
电子邮箱格式怎么写
2014/01/12 职场文书
《骑牛比赛》教后反思
2014/04/22 职场文书
冬季安全检查方案
2014/05/23 职场文书
解除租房协议书
2014/12/03 职场文书
2015新教师教学工作总结
2015/07/22 职场文书
运动会运动员赞词
2015/07/22 职场文书
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python
mybatis-plus模糊查询指定字段
2022/04/28 Java/Android
类和原型的设计模式之复制与委托差异
2022/07/07 Javascript