Python實現的多叉樹尋找最短路徑演算法示例

2022-10-03 08:57:13 字數 2300 閱讀 9609

多叉樹的最短路徑:

思想:傳入start 和 end 兩個 目標值

1 找到從根節點到目標節點的路徑

2 從所在路徑,尋找最近的公共祖先節點,

3 對最近公共祖先根節點 拼接路徑

python**:

# -*- coding:utf-8 -*-

import copy

#節點資料結構

clas程式設計客棧s 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():

'''初始化一顆測試二叉樹:

ab 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 == 'n程式設計客棧o':

return '無窮大','無節點'

# 對兩個路徑 從尾巴開始向頭 找到最近的公共根節點,合併根節點

len1,len2 = len(path1),len(path2)

for i in range(len1-1,-1,-1):

if path 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)

執行結果:

5:f->b->a->d->i

利用多叉樹(字典樹)實現簡單的快速搜尋

看到題目第一時間想到樹,而且是多叉樹。為什麼呢?然後我們換個想法,我們可以先把單詞按照字母為單位分割,然後第1個字母在樹的第一層搜尋,若不存在該字母則新增該字母為本層的兄弟節點,存在該字母就選擇第2個字母,跳到下一層的首節點,再逐個搜尋,若不存在該字母則新增該字母為本層的兄弟節點,存在該字母就選擇第...

二叉樹最簡單實現(c )

二叉樹的實現 這是我複習的第三部分,二叉樹的實現,這次需要的 比較少,所以把主函式貼出來了,注釋也很清晰,所以大家直接看 吧 樹 ifndef binnode h define binnode h template class elem class binnode endif 建樹操作 ifndef...

最基礎的樹 二叉樹

樹,是一種非線性資料結構,樹中的元素具有明顯的層次特性。在這種資料結構中,每個結點只有乙個前驅,卻可以有多個後繼,類似樹,只有一根主幹,卻可以有很多分支。通常我們研究的是二叉樹,即每個結點只能分一叉的樹。二叉樹我們可以表示成下圖的樣子,實際像一棵倒過來的樹,或者像乙個樹根。其有root根節點,相連的...