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实现的简单万年历例子分享
Apr 25 Python
Python科学计算包numpy用法实例详解
Feb 08 Python
python 矩阵增加一行或一列的实例
Apr 04 Python
numpy matrix和array的乘和加实例
Jun 28 Python
python 读取视频,处理后,实时计算帧数fps的方法
Jul 10 Python
在Python中获取两数相除的商和余数方法
Nov 10 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
Feb 25 Python
python数据库编程 Mysql实现通讯录
Mar 27 Python
解决django接口无法通过ip进行访问的问题
Mar 27 Python
pyinstaller打包找不到文件的问题解决
Apr 15 Python
pycharm实现猜数游戏
Dec 07 Python
python 利用panda 实现列联表(交叉表)
Feb 06 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用户指南-cookies部分
2006/10/09 PHP
关于PHP的curl开启问题探讨
2014/04/08 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
2015/03/05 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
2016/07/06 PHP
php使用 readfile() 函数设置文件大小大小的方法
2017/08/11 PHP
php中字符串和整数比较的操作方法
2019/06/06 PHP
extjs 如何给column 加上提示
2014/07/29 Javascript
jQuery获得document和window对象宽度和高度的方法
2015/03/25 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
javascript实现图片跟随鼠标移动效果的方法
2015/05/13 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
2015/11/24 Javascript
深入浅析jQuery对象$.html
2016/08/22 Javascript
BootStrap的table表头固定tbody滚动的实例代码
2016/08/24 Javascript
js模式化窗口问题![window.dialogArguments]
2016/10/30 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
详解javascript常用工具类的封装
2018/01/30 Javascript
Vue.js 2.0和Cordova开发webApp环境搭建方法
2018/02/26 Javascript
Vue前端开发规范整理(推荐)
2018/04/23 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
2018/09/25 Javascript
在vue中使用echarts(折线图的demo,markline用法)
2020/07/20 Javascript
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
python操作excel文件并输出txt文件的实例
2018/07/10 Python
Python3 读、写Excel文件的操作方法
2018/10/20 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
Python Lambda函数使用总结详解
2019/12/11 Python
SpringBoot首页设置解析(推荐)
2021/02/11 Python
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
一套Java笔试题
2016/08/20 面试题
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
师范生实习自我鉴定
2013/11/01 职场文书
幼儿园小班植树节活动方案
2014/03/04 职场文书
检讨书怎么写
2015/01/23 职场文书
解读MySQL的客户端和服务端协议
2021/05/10 MySQL
Android studio 简单计算器的编写
2022/05/20 Java/Android