Python實(shí)現(xiàn)的多叉樹(shù)尋找最短路徑算法示例
本文實(shí)例講述了Python實(shí)現(xiàn)的多叉樹(shù)尋找最短路徑算法。分享給大家供大家參考,具體如下:
多叉樹(shù)的最短路徑:
思想:
傳入start 和 end 兩個(gè) 目標(biāo)值
1 找到從根節(jié)點(diǎn)到目標(biāo)節(jié)點(diǎn)的路徑
2 從所在路徑,尋找最近的公共祖先節(jié)點(diǎn),
3 對(duì)最近公共祖先根節(jié)點(diǎn) 拼接路徑
Python代碼:
# -*- coding:utf-8 -*- import copy #節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu) class Node(object): # 初始化一個(gè)節(jié)點(diǎn) def __init__(self,value = None): self.value = value # 節(jié)點(diǎn)值 self.child_list = [] # 子節(jié)點(diǎn)列表 # 添加一個(gè)孩子節(jié)點(diǎn) def add_child(self,node): self.child_list.append(node) # 初始化一顆測(cè)試二叉樹(shù) def init(): ''' 初始化一顆測(cè)試二叉樹(shù): 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é)點(diǎn)到目標(biāo)節(jié)點(diǎn)的路徑 def deep_first_search(cur,val,path=[]): path.append(cur.value) # 當(dāng)前節(jié)點(diǎn)值添加路徑列表 if cur.value == val: # 如果找到目標(biāo) 返回路徑列表 return path if cur.child_list == []: # 如果沒(méi)有孩子列表 就 返回 no 回溯標(biāo)記 return 'no' for node in cur.child_list: # 對(duì)孩子列表里的每個(gè)孩子 進(jìn)行遞歸 t_path = copy.deepcopy(path) # 深拷貝當(dāng)前路徑列表 res = deep_first_search(node,val,t_path) if res == 'no': # 如果返回no,說(shuō)明找到頭 沒(méi)找到 利用臨時(shí)路徑繼續(xù)找下一個(gè)孩子節(jié)點(diǎn) continue else : return res # 如果返回的不是no 說(shuō)明 找到了路徑 return 'no' # 如果所有孩子都沒(méi)找到 則 回溯 # 獲取最短路徑 傳入兩個(gè)節(jié)點(diǎn)值,返回結(jié)果 def get_shortest_path( start,end ): # 分別獲取 從根節(jié)點(diǎn) 到start 和end 的路徑列表,如果沒(méi)有目標(biāo)節(jié)點(diǎn) 就返回no path1 = deep_first_search(root, start, []) path2 = deep_first_search(root, end, []) if path1 == 'no' or path2 == 'no': return '無(wú)窮大','無(wú)節(jié)點(diǎn)' # 對(duì)兩個(gè)路徑 從尾巴開(kāi)始向頭 找到最近的公共根節(jié)點(diǎn),合并根節(jié)點(diǎn) 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)
運(yùn)行結(jié)果:
5:F->B->A->D->I
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門(mén)與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- python編寫(xiě)的最短路徑算法
- Python數(shù)據(jù)結(jié)構(gòu)與算法之圖的最短路徑(Dijkstra算法)完整實(shí)例
- Python使用Dijkstra算法實(shí)現(xiàn)求解圖中最短路徑距離問(wèn)題詳解
- python Dijkstra算法實(shí)現(xiàn)最短路徑問(wèn)題的方法
- Python實(shí)現(xiàn)最短路徑問(wèn)題的方法
- python實(shí)現(xiàn)最短路徑的實(shí)例方法
- python3實(shí)現(xiàn)Dijkstra算法最短路徑的實(shí)現(xiàn)
- python3實(shí)現(xiàn)無(wú)權(quán)最短路徑的方法
- Python?最短路徑的幾種求解方式
相關(guān)文章
python 用遞歸實(shí)現(xiàn)通用爬蟲(chóng)解析器
這篇文章主要介紹了python 用遞歸實(shí)現(xiàn)通用爬蟲(chóng)解析器的方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04python實(shí)現(xiàn)數(shù)值積分的Simpson方法實(shí)例分析
這篇文章主要介紹了python實(shí)現(xiàn)數(shù)值積分的Simpson方法,實(shí)例分析了Python實(shí)現(xiàn)積分運(yùn)算的相關(guān)技巧,需要的朋友可以參考下2015-06-06python 字典 按key值大小 倒序取值的實(shí)例
今天小編就為大家分享一篇python 字典 按key值大小 倒序取值的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07

Python常見(jiàn)報(bào)錯(cuò)解決之SciPy和NumPy版本沖突

教你如何利用python3爬蟲(chóng)爬取漫畫(huà)島-非人哉漫畫(huà)

python對(duì)列進(jìn)行平移變換的方法(shift)

Pycharm如何導(dǎo)入python文件及解決報(bào)錯(cuò)問(wèn)題