完全原创,能力有限,欢迎参考,未经允许,请勿转载 !

完全原创,能力有限,欢迎参考,未经允许,请勿转载 !

完全原创,能力有限,欢迎参考,未经允许,请勿转载 !

完全原创,能力有限,欢迎参考,未经允许,请勿转载 !

多叉树的最短路径:

思想:
传入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实现 多叉树 寻找最短路径的更多相关文章

  1. Mininet实验 使用l2_multi模块寻找最短路径实验

    参考:使用l2_multi模块寻找最短路径实验 1. 实验目的 1.认识VND并且掌握其基本使用方法. 2.学会使用pox控制器的l2_multi模块寻找主机间的最短传输路径. 2. 实验原理 VND ...

  2. 启发式搜索A-Star算法 【寻找 最短路径 算法】【地理几何位置 可利用的情况】

    在处理最短路径问题时,有一种启发式算法是我们应该了解的,由于其有着优秀的探索效率在各自现实项目中多有应用,它就是 A-star 算法,或  A*  算法. 个人观点: A*  算法并不保证找到的路径一 ...

  3. xdoj新生现场赛1269——带有限制条件的bfs 寻找最短路径

    bfss是解决最短路径的强大武器 (尝试dfs寻找最短路径 -(7*7)就会爆炸) 例题1  ccf 201604-4  游戏 问题描述 小明在玩一个电脑游戏,游戏在一个n×m的方格图上进行,小明控制 ...

  4. Python Treelib 多叉树 数据结构 中文使用帮助文档

    树,对于计算机编程语言来说是一个重要的数据结构.它具有广泛的应用,比如文件系统的分层数据结构和机器学习中的一些算法.这里创建了treelib来提供Python中树数据结构的高效实现. 官方文档:htt ...

  5. 在图中寻找最短路径-----深度优先算法C++实现

    求从图中的任意一点(起点)到另一点(终点)的最短路径,最短距离: 图中有数字的点表示为图中的不同海拔的高地,不能通过:没有数字的点表示海拔为0,为平地可以通过: 这个是典型的求图中两点的最短路径:本例 ...

  6. Python小练习之寻找101到200之间的素数

    方法1:from math import * def primeNumber(start,end): num = 0 for i in range(start,end): flag = 0 for j ...

  7. Python——用os模块寻找指定目录(包括子目录)下所有图片文件

    import os # 导入os模块 def search_file(start_dir): img_list = [] extend_name = ['.jpg', '.png', '.gif'] ...

  8. 寻找最短路径Dijkstra算法

    1 /** 2 * 1.对于T中的每个顶点u,找到u的具有最小权重的连接边.所有到u的连接边都存储在queues.get(u)中.queues.get(u).peek()返回拥有最小权值 3 * 的连 ...

  9. python利用kruskal求解最短路径的问题

    python利用kruskal算法求解最短路径的问题,修改参数后可以直接使用 def kruskal(): """ kruskal 算法 ""&quo ...

随机推荐

  1. 关于Roll A Ball实例练习记录

    学习中不段进步! 游戏思路:通过键盘控制白色小球,让它"捡起"柠黄色方块,捡起一个加1分,全部捡起游戏胜利! 游戏对象: Ground:绿色地面 player:  小球 Obsta ...

  2. MongoDb进阶实践之一 如何在Linux(CentOS 7)上安装MongoDB

    一.NoSQL数据简介         1.NoSQL概念                   NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",是 ...

  3. poj-2909-哥德巴赫猜想

    Description For any even number n greater than or equal to 4, there exists at least one pair of prim ...

  4. webpack学习

    // 一个常见的`webpack`配置文件 const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-we ...

  5. 本地不安装oracle,PLsql远程连接

    Oracle的Instant client工具包可以很好地解决本地不安装oracle,PLsql远程连接. 1.首先到Oracle网站下载Instant Client : http://www.ora ...

  6. 常用linux日志查询命令

    1.查看实时日志: tail -f nohup.out 2.分页查看所有日志: cat nohup.out | more 4.分页查看前N行日志: tail -n 1000 nohup.out | m ...

  7. color 圆盘染色

    Color 圆盘染色 题目大意:给你一个圆盘,等分成n个扇形,有m种颜色,每两个相邻的扇形不能相交,求染色方案数. 注释:m,n<=$10^6$. 想法:这题是小圆盘染色的加强版(小圆盘染色?) ...

  8. 去除input的自动填充色

    input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px #ffffff inset !important; }

  9. Hibernate学习笔记二

    Hibernate持久化类的编写规则 Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓持久化,就是将内存中的数据永久存储到关系型数据库中. 持久化类 一个java类与数据库表建 ...

  10. 一个非常标准的连接Mysql数据库的示例代码

    一.About Mysql 1.Mysql 优点 体积小.速度快.开放源码.免费 一般中小型网站的开发都选择 MySQL ,最流行的关系型数据库 LAMP / LNMP Linux作为操作系统 Apa ...