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显示天气预报
Mar 02 Python
python中实现延时回调普通函数示例代码
Sep 08 Python
python添加模块搜索路径方法
Sep 11 Python
一道python走迷宫算法题
Jan 22 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
Python面向对象原理与基础语法详解
Jan 02 Python
PyTorch在Windows环境搭建的方法步骤
May 12 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
Python unittest基本使用方法代码实例
Jun 29 Python
基于Python+QT的gui程序开发实现
Jul 03 Python
Django filter动态过滤与排序实现过程解析
Nov 26 Python
Python3利用openpyxl读写Excel文件的方法实例
Feb 03 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验证码实现代码
2014/05/10 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
Zend Framework动作助手Json用法实例分析
2016/03/05 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
javascript for循环设法提高性能
2010/02/24 Javascript
关于jquery.validate1.9.0前台验证的使用介绍
2013/04/26 Javascript
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
nodejs实现HTTPS发起POST请求
2015/04/23 NodeJs
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
js同源策略详解
2015/05/21 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
2015/06/01 Javascript
jQuery实现提示密码强度的代码
2015/07/15 Javascript
Ajax分页插件Pagination从前台jQuery到后端java总结
2016/07/22 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
JS图片预加载插件详解
2017/06/21 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
Javascript作用域和作用域链原理解析
2020/03/03 Javascript
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
一道python走迷宫算法题
2018/01/22 Python
Python Unittest自动化单元测试框架详解
2018/04/04 Python
在Python中使用Neo4j的方法
2019/03/14 Python
Django ORM 常用字段与不常用字段汇总
2019/08/09 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
2020/04/09 Python
使用pycharm和pylint检查python代码规范操作
2020/06/09 Python
Python描述数据结构学习之哈夫曼树篇
2020/09/07 Python
英国领先的狗和宠物美容专家:Christies Direct
2017/04/03 全球购物
法国在线药房:Shop Pharmacie
2019/11/26 全球购物
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
酒吧员工的岗位职责
2013/11/26 职场文书
市场营销大学生职业规划书
2014/02/25 职场文书
高三英语教学计划
2015/01/23 职场文书
导游词之安徽巢湖
2019/12/26 职场文书
MySQL 十大常用字符串函数详解
2021/06/30 MySQL
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL