本文實(shí)例講述了Python實(shí)現(xiàn)的多叉樹尋找最短路徑算法。分享給大家供大家參考,具體如下:
創(chuàng)新互聯(lián)自2013年創(chuàng)立以來,先為南沙等服務(wù)建站,南沙等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為南沙企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。多叉樹的最短路徑:
思想:
傳入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è)試二叉樹 def init(): ''' 初始化一顆測(cè)試二叉樹: 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 == []: # 如果沒有孩子列表 就 返回 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,說明找到頭 沒找到 利用臨時(shí)路徑繼續(xù)找下一個(gè)孩子節(jié)點(diǎn) continue else : return res # 如果返回的不是no 說明 找到了路徑 return 'no' # 如果所有孩子都沒找到 則 回溯 # 獲取最短路徑 傳入兩個(gè)節(jié)點(diǎn)值,返回結(jié)果 def get_shortest_path( start,end ): # 分別獲取 從根節(jié)點(diǎn) 到start 和end 的路徑列表,如果沒有目標(biāo)節(jié)點(diǎn) 就返回no path2 = deep_first_search(root, start, []) path3 = deep_first_search(root, end, []) if path2 == 'no' or path3 == 'no': return '無窮大','無節(jié)點(diǎn)' # 對(duì)兩個(gè)路徑 從尾巴開始向頭 找到最近的公共根節(jié)點(diǎn),合并根節(jié)點(diǎn) 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) # 主函數(shù)、程序入口 if __name__ == '__main__': root = init() res = get_shortest_path('F','I') print(res)
當(dāng)前標(biāo)題:Python實(shí)現(xiàn)的多叉樹尋找最短路徑算法示例-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://vcdvsql.cn/article46/cdijhg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、關(guān)鍵詞優(yōu)化、做網(wǎng)站、企業(yè)網(wǎng)站制作、定制網(wǎng)站、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容