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代理抓取并验证使用多线程实现
May 03 Python
Python Queue模块详解
Nov 30 Python
Python中用于检查英文字母大写的isupper()方法
May 19 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 Python
python实现批量解析邮件并下载附件
Jun 19 Python
Python全排列操作实例分析
Jul 24 Python
Django框架自定义模型管理器与元选项用法分析
Jul 22 Python
Python3从零开始搭建一个语音对话机器人的实现
Aug 23 Python
Django后台管理系统的图文使用教学
Jan 20 Python
基于pytorch padding=SAME的解决方式
Feb 18 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
Jul 31 Python
python从ftp获取文件并下载到本地
Dec 05 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 读取文件的正确方法
2009/04/29 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
2017/07/03 PHP
js 日期转换成中文格式的函数
2009/07/07 Javascript
jquery ui resizable bug解决方法
2010/10/26 Javascript
juqery 学习之五 文档处理 插入
2011/02/11 Javascript
js获取图片大小的函数代码
2011/09/20 Javascript
js 通用订单代码
2013/12/23 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
2014/05/20 Javascript
JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
2014/11/08 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
2019/08/11 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
[01:14]DOTA2亚洲邀请赛小组赛赛前花絮
2017/03/27 DOTA
几个提升Python运行效率的方法之间的对比
2015/04/03 Python
python递归查询菜单并转换成json实例
2017/03/27 Python
python 堆和优先队列的使用详解
2019/03/05 Python
安装Pycharm2019以及配置anconda教程的方法步骤
2019/11/11 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
python 从list中随机取值的方法
2020/11/16 Python
CSS3实现多背景模拟动态边框的效果
2016/11/08 HTML / CSS
大专生毕业的自我评价
2014/02/06 职场文书
工商治理实习生的自我评价分享
2014/02/20 职场文书
年终考核实施方案
2014/05/26 职场文书
班子成员四风问题自我剖析材料
2014/09/29 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
出租车拒载检讨书
2015/01/28 职场文书
公务员个人年终总结
2015/02/12 职场文书
居安思危观后感
2015/06/11 职场文书
2015年库房管理工作总结
2015/10/14 职场文书
2015年四年级班主任工作总结
2015/10/22 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python