python实现 多叉树 寻找最短路径
完全原创,能力有限,欢迎参考,未经允许,请勿转载 !
完全原创,能力有限,欢迎参考,未经允许,请勿转载 !
完全原创,能力有限,欢迎参考,未经允许,请勿转载 !
完全原创,能力有限,欢迎参考,未经允许,请勿转载 !
多叉树的最短路径: 思想:
传入start 和 end 两个 目标值
1 找到从根节点到目标节点的路径
2 从所在路径,寻找最近的公共祖先节点,
3 对最近公共祖先根节点 拼接路径
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)
python实现 多叉树 寻找最短路径的更多相关文章
- Mininet实验 使用l2_multi模块寻找最短路径实验
参考:使用l2_multi模块寻找最短路径实验 1. 实验目的 1.认识VND并且掌握其基本使用方法. 2.学会使用pox控制器的l2_multi模块寻找主机间的最短传输路径. 2. 实验原理 VND ...
- 启发式搜索A-Star算法 【寻找 最短路径 算法】【地理几何位置 可利用的情况】
在处理最短路径问题时,有一种启发式算法是我们应该了解的,由于其有着优秀的探索效率在各自现实项目中多有应用,它就是 A-star 算法,或 A* 算法. 个人观点: A* 算法并不保证找到的路径一 ...
- xdoj新生现场赛1269——带有限制条件的bfs 寻找最短路径
bfss是解决最短路径的强大武器 (尝试dfs寻找最短路径 -(7*7)就会爆炸) 例题1 ccf 201604-4 游戏 问题描述 小明在玩一个电脑游戏,游戏在一个n×m的方格图上进行,小明控制 ...
- Python Treelib 多叉树 数据结构 中文使用帮助文档
树,对于计算机编程语言来说是一个重要的数据结构.它具有广泛的应用,比如文件系统的分层数据结构和机器学习中的一些算法.这里创建了treelib来提供Python中树数据结构的高效实现. 官方文档:htt ...
- 在图中寻找最短路径-----深度优先算法C++实现
求从图中的任意一点(起点)到另一点(终点)的最短路径,最短距离: 图中有数字的点表示为图中的不同海拔的高地,不能通过:没有数字的点表示海拔为0,为平地可以通过: 这个是典型的求图中两点的最短路径:本例 ...
- Python小练习之寻找101到200之间的素数
方法1:from math import * def primeNumber(start,end): num = 0 for i in range(start,end): flag = 0 for j ...
- Python——用os模块寻找指定目录(包括子目录)下所有图片文件
import os # 导入os模块 def search_file(start_dir): img_list = [] extend_name = ['.jpg', '.png', '.gif'] ...
- 寻找最短路径Dijkstra算法
1 /** 2 * 1.对于T中的每个顶点u,找到u的具有最小权重的连接边.所有到u的连接边都存储在queues.get(u)中.queues.get(u).peek()返回拥有最小权值 3 * 的连 ...
- python利用kruskal求解最短路径的问题
python利用kruskal算法求解最短路径的问题,修改参数后可以直接使用 def kruskal(): """ kruskal 算法 ""&quo ...
随机推荐
- Online Judge(OJ)搭建——2、数据库,SQL语句
数据库EER图 数据库表.字段.约束解释 users 用户: id 标识符,email 邮箱,password 密码,name 姓名,sex 性别,enabled 启用 ,role 角色 id pri ...
- CSS( Cascading Style Sheets )简书
(注:带*号的属性是CSS3新增属性)一.基本规则1.css通常存储在样式表(style)中,用于定义如何显示HTML元素:2.css主要由两个部分构成:选择器和一条或多条声明. 选择器通常是需要改变 ...
- python趣味 ——奇葩的全局形参
在c++,c#,js等语言中: 函数定义(参数) 函数体:参数修改 这里的参数修改都是仅限于这个函数体内的 python不知道是不是bug,我们这样写: def test(a=[]): a.appen ...
- 剑指Offer-链表中环的入口结点
package LinkedList; import java.util.HashSet; /** * 链表中环的入口结点 * 一个链表中包含环,请找出该链表的环的入口结点. */ public cl ...
- git分支的创建与合并
在git中提倡使用分支,这就涉及到了分支的创建和合并.在git中我们的每次提交类似于一个链表,按照时间顺序向下排列,大约画了一个图,每个小圆圈代表一次提交,在git中有有一个主分支master,我们新 ...
- Android_scaleType属性
这里我们重点理解ImageView的属性android:scaleType,即ImageView.setScaleType(ImageView.ScaleType).android:scaleType ...
- 浅析Python多线程
学习Python多线程的资料很多,吐槽Python多线程的博客也不少.本文主要介绍Python多线程实际应用,且假设读者已经了解多线程的基本概念.如果读者对进程线程概念不甚了解,可参见知名博主 阮一峰 ...
- Algorithm --> 小于N的正整数含有1的个数
//https://leetcode.com/problems/number-of-digit-one/ Given an integer n, count the total number of d ...
- java并发包——阻塞队列BlockingQueue及源码分析
一.摘要 BlockingQueue通常用于一个线程在生产对象,而另外一个线程在消费这些对象的场景,例如在线程池中,当运行的线程数目大于核心的线程数目时候,经常就会把新来的线程对象放到Blocking ...
- java————面向对象概念
面向对象 OO:面向对象 OOP:面向对象编程 OOA:面向对象分析 OOD:面向对象设计 面向对象的特征 继承,封装,多态 什么是对象? 对象是存在的具体实体,具有明确定义的特征和行为. 万物皆对象 ...