Python实现的多叉树寻找最短路径算法示例
作者:稀里糊涂林老冷 发布时间:2023-03-07 16:37:23
标签:Python,多叉树,最短路径,算法
本文实例讲述了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程序设计有所帮助。
来源:http://www.cnblogs.com/Lin-Yi/p/7780777.html


猜你喜欢
- 今天来说说编程语言中的动态类型语言与鸭子类型。动态语言 * 对动态语言的定义:动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数
- 在用ThinkPHP做tags标签的时候,出现了一个问题,就是能获取到参数,但是查不出相应的结果。查看数据库发现数据是存在的。问题出在哪了呢
- 目标是拷贝微信的飞机大战,当然拷贝完以后大家就具备自己添加不同内容的能力了。首先是要拿到一些图片素材,熟悉使用图像处理软件和绘画的人可以自己
- shelve类似于一个key-value数据库,可以很方便的用来保存Python的内存对象,其内部使用pickle来序列化数据,简单来说,使
- 常用方法#记住引入numpy时要是用别名np,则所有的numpy字样都要替换 #查询数值类型>>>type(float)d
- 由于最近有个任务需要在python环境下跑,项目是python3.6 + tensorflow1.3.1.现总结安装环境:卸载Python3
- 本文实例为大家分享了Django下完成文件上传和下载功能的具体代码,供大家参考,具体内容如下一、文件上传Views.pydef upload
- Tensor.to(device)和model.to(device)的区别区别所在使用GPU训练的时候,需要将Module对象和Tensor
- KindEditor简介: KindEditor是一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开发人员可以用
- 1. 参数解析1.1 inplace参数取值:True、FalseTrue:直接修改原对象False:创建一个副本,修改副本,原对象不变(缺
- 本教学使用环境介绍伺服器端:Ubuntu 18.04 LTS资料库:Mariadb 10.1.34(Mysql)语言版本:php 7.3本机
- 说明1、模型集成是指将一系列不同模型的预测结果集成在一起,从而获得更好的预测结果。2、对于模型集成来说,模型的多样性非常重要。Diversi
- 开发的时候我都是使用XDebug在本地调试,但是最近加入一些项目中去,环境太复杂了,要在本地搭建一个开发环境真的太麻烦了,那么我们怎么使用x
- 注意转义字符\的使用\\,\",\$ 注意使用8进制或16进制字符表示 \xf6 echo "H\xf6me"
- 因为最近公司有python项目维护,所以把python的基础入门的书整理一遍,因为有些忘记了,同时在看<<python编程>
- 前言:Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足。但是,有很多时候,Python 的效率并
- PHP 过滤器PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入。什么是 PHP 过滤器PHP 过滤器用于验证和过滤来自非安全
- js代码:window.alert = function(msg, callback) {var div = document.create
- multiprocessing.Pipe([duplex]) 返回2个连接对象(conn1, conn2),代表管道的两端,默认是双向通信.
- 前段时间写了个比较简单的批量水印添加的python实现方式,将某个文件夹下面的图片全部添加上水印。今天正好有时间就做了一个UI应用的封装,这