您好,登錄后才能下訂單哦!
本文實例講述了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 path2 = deep_first_search(root, start, []) path3 = deep_first_search(root, end, []) if path2 == 'no' or path3 == 'no': return '無窮大','無節點' # 對兩個路徑 從尾巴開始向頭 找到最近的公共根節點,合并根節點 len1,len2 = len(path2),len(path3) for i in range(len1-1,-1,-1): if path2[i] in path3: index = path3.index(path2[i]) path3 = path3[index:] path2 = path2[-1:i:-1] break res = path2+path3 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相關內容感興趣的讀者可查看本站專題:《Python數據結構與算法教程》、《Python編碼操作技巧總結》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》及《Python入門與進階經典教程》
希望本文所述對大家Python程序設計有所幫助。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。