树的广度优先搜索(BFS),深度优先搜索(DFS)
生活随笔
收集整理的這篇文章主要介紹了
树的广度优先搜索(BFS),深度优先搜索(DFS)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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與樹的層序遍歷類似,使用隊列實現
算法流程:
??????取隊列第一個元素
??????if該元素的左孩子不為空
????????????將左孩子append到隊列
??????if該元素的右孩子不為空
????????????將右孩子append到隊列
??????打印該元素的val
代碼:
def BFS(root): # 使用列表作為隊列queue = []# 將首個根節點添加到隊列中queue.append(root)print(root)# 當隊列不為空時進行遍歷while queue:# 從隊列頭部取出一個節點并判斷其是否有左右節點# 若有子節點則把對應子節點添加到隊列中,且優先判斷左節點temp = queue.pop(0)if temp.left:queue.append(left)if temp.right:queue.append(right)print(temp.val,end=" ")2.DFS
DFS跟前序遍歷一樣,使用棧實現
算法流程:
??????取棧最后一個元素
??????if該元素的右孩子不為空
????????????將右孩子append到棧
??????if該元素的左孩子不為空
????????????將左孩子append到棧
??????打印該元素的val
代碼:
def DFS(root): # 使用列表作為棧stack = []# 將首個根節點添加到棧中stack.append(root)# 當棧不為空時進行遍歷while stack:# 從棧的末尾彈出一個節點并判斷其是否有左右節點# 若有子節點則把對應子節點壓入棧中,且優先判斷右節點temp = stack.pop()if temp.right:stack.append(right)if temp.left:stack.append(left)print(temp.val,end=" ")總結
以上是生活随笔為你收集整理的树的广度优先搜索(BFS),深度优先搜索(DFS)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TensorFlow:张量排序,填充和复
- 下一篇: 树的先序遍历,中序遍历,后续遍历(递归和