樹的廣度優先搜尋(BFS),深度優先搜尋 DFS

2021-10-08 18:49:14 字數 1266 閱讀 4178

bfs:breadth first search,廣度優先搜尋

dfs:depth first search,深度優先搜尋

如圖,a節點的下一級元素為b節點和c節點,b節點的下一級元素為d節點和e節點,c節點的下一級元素為f節點和g節點。

bfs優先遍歷當前節點下一級節點的同級元素,即若當前節點為a節點,則繼續遍歷的節點為b和c;當a的所有相鄰節點遍歷完以後,再遍歷b節點的相鄰節點d節點和e節點,以及c節點的相鄰節點f節點和g節點。至此,所有節點遍歷完成。

dfs優先遍歷當前節點下一級節點的下一級元素,即若當前節點為a節點,則繼續遍歷的節點為b節點和b節點的下一級節點d節點;d節點沒有下一級節點,此時再返回d節點的上一級b節點處,再遍歷b節點的另乙個下一級元素e節點,若沒有未遍歷過的下一級元素,則返回上一級,依此規律遍歷整個樹,完成樹的dfs。

1.bfs

bfs與樹的層序遍歷類似,使用佇列實現

演算法流程:

**:

def bfs(root):

# 使用列表作為佇列

queue =

# 將首個根節點新增到佇列中

print(root)

# 當佇列不為空時進行遍歷

while queue:

# 從佇列頭部取出乙個節點並判斷其是否有左右節點

# 若有子節點則把對應子節點新增到佇列中,且優先判斷左節點

temp = queue.pop(0)

if temp.left:

if temp.right:

print(temp.val,end=" ")

2.dfsdfs跟前序遍歷一樣,使用棧實現

演算法流程:

**:

def dfs(root):

# 使用列表作為棧

stack =

# 將首個根節點新增到棧中

# 當棧不為空時進行遍歷

while stack:

# 從棧的末尾彈出乙個節點並判斷其是否有左右節點

# 若有子節點則把對應子節點壓入棧中,且優先判斷右節點

temp = stack.pop()

if temp.right:

if temp.left:

print(temp.val,end=" ")

深度優先搜尋(DFS)和廣度優先搜尋(BFS)

先說dfs 關於dfs和bfs的搜尋題目,首先要將其轉化為樹,如迷宮,也可轉化為樹來搜尋 dfs是一條鏈一條鏈的搜尋,而bfs是逐層進行搜尋,這是他倆乙個很大的區別 給定整數a1 a2 a3 an,判斷是否可以從中選出若干個數,使得他們的和恰好為k。限制條件 樣例 4 n 1 2 4 7 a陣列 1...

深度優先搜尋 DFS 與廣度優先搜尋 BFS)

bfs和dfs演算法原理 通俗易懂版 圖的廣度優先搜尋 bfs 和深度優先搜尋 dfs 演算法解析 void dfs int step 把乙個陣列看成部分,第一部分是它的第乙個元素,第二部分是它後面的元素 求整個陣列的排列,可看成兩步 第一步求所有可能出現在第乙個位置的元素,即把第乙個元素與後面的所...

深度優先搜尋(DFS)和廣度優先搜尋(BFS)

深度優先搜尋和廣度優先搜尋都是圖形搜尋演算法,1 深度優先搜尋 是針對圖和樹的遍歷演算法,利用深度優先搜尋演算法可以產生目標圖的相應的拓撲排序表,利用拓撲排序表可以方便的解決了很多相關的圖論問題,如最大路徑問題,一般用堆資料結構來輔助實現dfs 演算法,其過程要來說是對每乙個可能的分支路徑深入到不能...