Python 二叉樹的廣度優先搜尋和深度優先搜尋

2021-10-06 07:46:13 字數 2001 閱讀 9202

二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查詢樹和二叉堆。

1

/ \

2 3

/ \ / \

4 5 6 7

# 先定義乙個二叉樹的節點類

class

treenode

:def

__init__

(self, x)

: self.val = x # 該節點的值

self.left =

none

# 該節點的左子樹

self.right =

none

# 該節點的右子樹

# 構造例子中的二叉樹

""" 1

/ \

2 3

/ \ / \

4 5 6 7

"""root = treenode(1)

root.left = treenode(2)

root.left.left = treenode(4)

root.left.right = treenode(5)

root.right = treenode(3)

root.right.left = treenode(6)

root.right.right = treenode(7)

# 廣度優先搜尋

defbfs

(root)

: res =

q =[root]

# 先把根節點放進佇列中

while q:

# 當佇列不為空時進入迴圈體

current_node = q.pop(0)

# 取出佇列的第乙個節點

# 把該節點的值加入結果集

if current_node.left:

# 如果左子樹不為空,就加入佇列

if current_node.right:

# 如果右子樹不為空,就加入佇列

return res

print

(bfs(root)

)# 輸出:[1, 2, 3, 4, 5, 6, 7]

# 二叉樹直接復用上面的例子,不再重複構建

# 深度優先搜尋

defdfs

(root)

: res =

q =[root]

# 先把根節點放進棧中

while q:

# 當棧不為空時進入迴圈體

current_node = q.pop(

)# 取出棧頂節點

# 把該節點的值加入結果集

if current_node.right:

# 如果右子樹不為空,就壓入棧

if current_node.left:

# 如果左子樹不為空,就壓入棧

return res

print

(dfs(root)

)# 輸出:[1, 2, 4, 5, 3, 6, 7]

# 二叉樹直接復用上面的例子,不再重複構建

res =

# 使用遞迴實現深度優先搜尋

defdfs_recur

(node):if

not node:

# 遞迴結束的條件是當該節點為none時

return

# 把該節點的值加入結果集

dfs_recur(node.left)

# 對左子樹進行遞迴

dfs_recur(node.right)

# 對右子樹進行遞迴

dfs_recur(root)

print

(res)

# 輸出:[1, 2, 4, 5, 3, 6, 7]

廣度優先遍歷二叉樹

同學電面被問到乙個問題 如何獲得完全二叉樹的最後乙個節點?二叉樹以鍊錶的形式儲存。沒想到合適的辦法,用廣度遍歷吧,最後乙個節點就是了,如下 include include 樹節點的定義 struct tnode 佇列節點的定義 struct qnode 佇列的定義 struct queue 初始化佇...

二叉樹 廣度優先遍歷

廣度優先遍歷從最底層 或者最高層 開始,向下 或向上 逐層訪問每個節點,在每一層次上,從左到右 或從右到左 訪問每個節點。這樣就有4種訪問方式。當使用佇列時,這種遍歷方式的實現相當直接。假設從上到下 從左到右進行進行廣度優先遍歷。在訪問了乙個節點後,它的子節點 如果有的話 就放到佇列的末尾,然後訪問...

二叉樹的廣度優先搜尋

使用兩個佇列存放節點元素,佇列1用來存放未遍歷過的節點,佇列2用來存放遍歷的節點。具體步驟 步驟 1 把根結點,放到佇列1中。見圖 a 2 彈出佇列1的中的隊首元素,被彈出的元素放到佇列2中。若該隊首元素有子節點,按從到右的順序加入到佇列1中。見圖 b 3 重複步驟2 見圖 c 圖 h 4 整個過程...