python最短路径例子_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.mzph.cn/news/348458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零分钟即可在容器开发套件(CDK)上实现云运营

尽管这很有趣,但实际上并不可行,很快就遇到了使用限制。前一段时间, 我逐步完成了在容器中安装称为CloudForms的云管理解决方案。 真正的解决方案是将这个示例放入Red Hat Demo Central集合中,并将其放在基于开放技术的Cloud解决…

NTPv4协议解析

前言 本文的撰写基于RFC5905.NTP 是时间网络控制协议,V4版本相交V3版本,修复了V3存在的一些问题。尤其是NTPV4的拓展时间戳鼓励使用浮动双数据类型,这样使得NTP能够更好的支持1ns的场景,轮询间隔也从上一代的最多1024s拓展到了36…

c++中的引用和python中的引用_【总结】C++、C#、Java、Javascript、Python中引用的区别...

首先分两大阵营:C中引用是一块阵营,C#、Java、Javascript、Python中引用是另一块阵营。之所以这样分是因为同一阵营中引用使用方法基本一样。C引用本质是个常量指针,而其他语言引用本质是个普通指针。也就意味着C的引用一旦初始化(指向确定了…

看完这篇还不会化简卡诺图?你来打我

最通俗易懂的的卡诺图化简教程 首先我们来介绍一下什么是卡诺图: 卡诺图是逻辑函数的一种图形表示。一个逻辑函数的卡诺图就是将此函数的最小项表达式中的各最小项相应地填入一个方格图内,此方格图称为卡诺图。 卡诺图的构造特点使卡诺图具有一个重要性…

javabean 连接mysql_连接mysql的javabean实例+简单分页

连接mysql的javabean实例简单分页rs.getString(user_id)rs.getString(user_name)rs.getString(user_mail)rs.getString(user_adds)int Cint(String cint){try {int n;n Integer.parseInt(cint);return n;}catch (NumberFormatException e) {return 0;}}%>int PageSize5; //设…

java 工厂方法模式_Java中的工厂方法模式

java 工厂方法模式在上一篇有关模板方法模式的文章中 ,我展示了如何利用lambda表达式和默认方法 。 在本文中,我将探讨工厂方法模式,并了解如何利用方法引用,这是Java 8中与lambda表达式一起添加的另一项功能。 让我们考虑一个Ve…

几种常见的集成触发器(D、T、JK)

同步RS触发器存在“空翻”现象,即触发器存在多次翻转的现象,空翻破坏了“时序电路按时钟节拍工作,每个时钟脉冲作用下电路的状态只发生一次转换”的基本原则 解决方法:将电平触发改为边沿触发,使得触发器旨在时钟脉冲…

mysql md5版本校验_MySQL查询以名称的md5版本更新所有条目?

为此,您可以使用MD5()。让我们首先创建一个表-mysql> create table DemoTable1887(Password text,HashPassword text);使用插入命令在表中插入一些记录-mysql> insert into DemoTable1887(Password) values(John9089);mysql> insert into DemoTable1887(Pa…

Hashcat从入门到入土(一)

Hashcat的官方是这么介绍自己的 Hashcat is a password recovery tool. It had a proprietary code base until 2015, but was then released as open source software. Versions are available for Linux, OS X, and Windows. Examples of hashcat-supported hashing algorith…

MySQL在哪里看secret_key_K8S 创建和查看secret(九)

yaml中的用户密码敏感信息一般都会采用密码存储采用base64编码进行加密[roothz-95 pv]# echo -n guang | base64emd1YW5nag[roothz-95 pv]# echo -n 1q2w#E$R | base64cat secret.ymalapiVersion: v1kind: Secretmetadata:name: mysecret2data:username: emd1YW5nagpassword: M…

java 语义_Java文件合并变得语义化

java 语义与任何程序员交谈,并询问他应该如何进行合并:“它应该理解代码,对其进行解析,然后根据结构进行合并” –他很可能会说。 而这恰恰是SemanticMerge for Java所做的:它解析要合并的文件(加上祖先或…

python循环指令_Python循环

布尔运算学习循环之前,先了解一个概念:布尔运算布尔运算是数字符号化的逻辑推演法,包括联合、相交、相减。在图形处理操作中引用了这种逻辑运算方法以使简单的基本图形组合产生新的形体,并由二维布尔运算发展到三维图形的布尔运算…

Apache Pulsar:分布式发布订阅消息系统

Apache Pulsar是一个开源的分布式pub-sub消息传递系统,最初由Yahoo创建,并且是Apache Software Foundation的一部分 。 Pulsar是用于服务器到服务器消息传递的多租户高性能解决方案。 脉冲星的主要功能包括[4]: 对Pulsar实例中的多个集群的…

查看mysql进程ps_linux ps命令查看当前运行的进程

Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想对进程进行实时的监控,应该用 top 命令。要对进程进行监测和控制&#xff0…

java获取文件编码_java如何获取文件编码格式

1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK。按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三…

java上传文件功能_Java MemoryMapped文件的功能

java上传文件功能Java MemoryMapped文件的功能 在JDK 1.4中,内存映射文件的一个有趣功能被添加到Java中,该功能允许将任何文件映射到OS内存以进行有效读取。 内存映射文件可用于开发IPC类型的解决方案。 本文是使用内存映射文件创建IPC的实验。 有关内存…

java代码快速_java代码编写快捷途经

CtrlR 然后按下R键SHiftAltR:对选定属性进行全局命名CtrlD:删除当前行CtrlQ: 定位到最后编辑的地方CtrlL: 定位在某行CtrlM: 最大化当前的 Edit(命令)CtrlO:快速显示大纲CtrlD:显示继承结构CtrlW :关掉当…

控制Java并行流的并行度

在掌握了这些新功能之后,随着Java 9的最新发布,我们有了许多新功能可以用来改进我们的解决方案。 Java 9的发布也是修改我们是否掌握Java 8功能的好时机。 在本文中,我想解决关于Java并行流的最常见的误解。 人们通常说您不能以编程方式控制…

java小型超市系统_Java小型超市收银系统

【实例简介】Java SE开发的超市收银系统,实现了数据库操作,文件读取数据,写入数据等操作【实例截图】【核心代码】超市收银系统└── 期末综合├── bin│ ├── Driver.class│ ├── control│ │ ├── ExportMenuController…

double取值范围 java_Java中float/double取值范围与精度

Java浮点数浮点数结构要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个东西&#…