日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

二叉树的遍历—广度优先(BFS)和深度优先(DFS)python实现

發(fā)布時間:2023/12/4 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树的遍历—广度优先(BFS)和深度优先(DFS)python实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

二叉樹

二叉樹(Binary tree)是樹形結構的一個重要類型。對于二叉樹的基礎知識這里不做過多介紹,下面我們直接介紹二叉樹的遍歷方式和如何用python代碼去實現(xiàn)二叉樹的遍歷。

二叉樹的遍歷(重點)

“前”、“中”、“后“是相對根節(jié)點來說的
深度優(yōu)先DFS(遞歸實現(xiàn))
先序遍歷根節(jié)點——左子樹——右子樹
中序遍歷:左子樹——根節(jié)點——右子樹
后序遍歷:左子樹——右子樹——根節(jié)點

廣度優(yōu)先BFS(配合隊列一起實現(xiàn))
層序遍歷(廣度優(yōu)先):

代碼實現(xiàn)

注意:在層序遍歷的時候我用的隊列是引入了collections中的隊列,其實我們也可以用python中的列表代替模擬隊列的操作。

from collections import dequeclass Node(object):def __init__(self,val,left=None,right=None):self.val = valself.left = leftself.right = right class Tree(object):def __init__(self):self.root = Nonedef add(self,item):"""只考慮尾插 ,并且層次遍歷后插入"""node = Node(item)# 考慮邊界條件# bool([None]) => True 這種情況進入while循環(huán)會出錯 if self.root is None:self.root = nodereturnqueue = deque() # 也可以用列表代替queue.append(self.root)while queue:cur_node = queue.popleft()if cur_node.left is None:cur_node.left = nodereturnelse:queue.append(cur_node.left)if cur_node.right is None:cur_node.right = nodereturnelse:queue.append(cur_node.right)def levelorder(self):"""層序遍歷(廣度優(yōu)先)"""# 考慮邊界條件if self.root is None:returnqueue = deque()queue.append(self.root)while queue:cur_node = queue.popleft()print(cur_node.val,end = " ")if cur_node.left is not None:queue.append(cur_node.left)if cur_node.right is not None:queue.append(cur_node.right)# 遞歸實現(xiàn)深度優(yōu)先 => 關注樹根節(jié)點的變化def preorder(self,node):"""遞歸實現(xiàn)先序遍歷"""# 終止條件if node is None:return# 循環(huán)部分print(node.val,end=" ")self.preorder(node.left)self.preorder(node.right)def inorder(self,node):"""遞歸實現(xiàn)中序遍歷"""# 終止條件if node is None:return# 循環(huán)部分self.inorder(node.left)print(node.val,end=" ")self.inorder(node.right) def postorder(self,node):"""遞歸實現(xiàn)后序遍歷"""# 終止條件if node is None:return# 循環(huán)部分self.postorder(node.left)self.postorder(node.right) print(node.val,end=" ")if __name__ == "__main__":tree = Tree()tree.add(0)tree.add(1)tree.add(2)tree.add(3)tree.add(4)tree.add(5)tree.add(6)tree.add(7)tree.add(8)tree.add(9)print("廣度優(yōu)先-層序遍歷:",end=" ")tree.levelorder()print("\n")print("深度優(yōu)先-先序遍歷:",end=" ")tree.preorder(tree.root)print("\n")print("深度優(yōu)先-中序遍歷:",end=" ")tree.inorder(tree.root)print("\n")print("深度優(yōu)先-后序遍歷:",end=" ")tree.postorder(tree.root)print("\n")

輸出結果:
廣度優(yōu)先-層序遍歷: 0 1 2 3 4 5 6 7 8 9

深度優(yōu)先-先序遍歷: 0 1 3 7 8 4 9 2 5 6

深度優(yōu)先-中序遍歷: 7 3 8 1 9 4 0 5 2 6

深度優(yōu)先-后序遍歷: 7 8 3 9 4 1 5 6 2 0

總結

以上是生活随笔為你收集整理的二叉树的遍历—广度优先(BFS)和深度优先(DFS)python实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。