Python實現(xiàn)的多叉樹尋找最短路徑算法示例
本文實例講述了Python實現(xiàn)的多叉樹尋找最短路徑算法。分享給大家供大家參考,具體如下:
多叉樹的最短路徑:
思想:
傳入start 和 end 兩個 目標值
1 找到從根節(jié)點到目標節(jié)點的路徑
2 從所在路徑,尋找最近的公共祖先節(jié)點,
3 對最近公共祖先根節(jié)點 拼接路徑
Python代碼:
# -*- coding:utf-8 -*-
import copy
#節(jié)點數(shù)據(jù)結構
class Node(object):
# 初始化一個節(jié)點
def __init__(self,value = None):
self.value = value # 節(jié)點值
self.child_list = [] # 子節(jié)點列表
# 添加一個孩子節(jié)點
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
# 深度優(yōu)先查找 返回從根節(jié)點到目標節(jié)點的路徑
def deep_first_search(cur,val,path=[]):
path.append(cur.value) # 當前節(jié)點值添加路徑列表
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,說明找到頭 沒找到 利用臨時路徑繼續(xù)找下一個孩子節(jié)點
continue
else :
return res # 如果返回的不是no 說明 找到了路徑
return 'no' # 如果所有孩子都沒找到 則 回溯
# 獲取最短路徑 傳入兩個節(jié)點值,返回結果
def get_shortest_path( start,end ):
# 分別獲取 從根節(jié)點 到start 和end 的路徑列表,如果沒有目標節(jié)點 就返回no
path1 = deep_first_search(root, start, [])
path2 = deep_first_search(root, end, [])
if path1 == 'no' or path2 == 'no':
return '無窮大','無節(jié)點'
# 對兩個路徑 從尾巴開始向頭 找到最近的公共根節(jié)點,合并根節(jié)點
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)
# 主函數(shù)、程序入口
if __name__ == '__main__':
root = init()
res = get_shortest_path('F','I')
print(res)
運行結果:
5:F->B->A->D->I
更多關于Python相關內容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結構與算法教程》、《Python編碼操作技巧總結》、《Python函數(shù)使用技巧總結》、《Python字符串操作技巧匯總》及《Python入門與進階經典教程》
希望本文所述對大家Python程序設計有所幫助。
相關文章
Python實現(xiàn)自動化對Word文檔添加或移除行號
Word文檔中的行號(行編號)功能是對于精細化的文檔編輯以及解析非常有用的功能,添加行號能夠極大地提升文檔的可讀性和定位效率,本文將介紹如何使用Python來實現(xiàn)自動化對Word文檔添加或移除行號,為文檔處理工作帶來便捷,需要的朋友可以參考下2024-07-07
Python實現(xiàn)批量修改圖片格式和大小的方法【opencv庫與PIL庫】
這篇文章主要介紹了Python實現(xiàn)批量修改圖片格式和大小的方法,結合實例形式分析了Python基于opencv庫與PIL庫針對圖片的讀寫、轉換相關操作技巧,需要的朋友可以參考下2018-12-12

