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的常见命令注入威胁
Feb 18 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
Apr 06 Python
Python使用re模块正则提取字符串中括号内的内容示例
Jun 01 Python
python实现猜数字小游戏
Mar 24 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
Jul 03 Python
Django实现网页分页功能
Oct 31 Python
python随机模块random的22种函数(小结)
May 15 Python
Python捕获异常堆栈信息的几种方法(小结)
May 18 Python
Python批量获取并保存手机号归属地和运营商的示例
Oct 09 Python
python如何实现递归转非递归
Feb 25 Python
Python实现位图分割的效果
Nov 20 Python
对象析构函数__del__在Python中何时使用
Mar 22 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
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
php获取后台Job管理的实现代码
2011/06/10 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
2013/06/28 PHP
微信支付开发教程(一)微信支付URL配置
2014/05/28 PHP
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
PHP实现验证码校验功能
2017/11/16 PHP
Laravel框架路由管理简单示例
2019/05/07 PHP
关于document.cookie的使用javascript
2008/04/11 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
2016/01/12 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
jQuery实现二维码扫描功能
2017/01/09 Javascript
教你用十行node.js代码读取docx的文本
2017/03/08 Javascript
NodeJS链接MySql数据库的操作方法
2017/06/27 NodeJs
JavaScript生成图形验证码
2020/08/24 Javascript
Postman模拟发送带token的请求方法
2018/03/31 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
2018/08/20 Javascript
Django接受前端数据的几种方法总结
2016/11/04 Python
用python实现对比两张图片的不同
2018/02/05 Python
pandas DataFrame数据转为list的方法
2018/04/11 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
Python原始套接字编程实例解析
2020/01/29 Python
Python实现RabbitMQ6种消息模型的示例代码
2020/03/30 Python
Python代码中如何读取键盘录入的值
2020/05/27 Python
通过实例了解Python异常处理机制底层实现
2020/07/23 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
python实现移动木板小游戏
2020/10/09 Python
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
中专生的个人自我评价
2013/12/11 职场文书
班主任工作年限证明
2014/01/12 职场文书
广告设计应届生求职信
2014/03/01 职场文书
激励员工的口号
2014/06/16 职场文书
党员证明信
2015/06/19 职场文书
解除合同协议书范本
2016/03/21 职场文书
简短的人生哲理(38句)
2019/08/13 职场文书