二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(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 整個過程...