二叉查詢樹(英語:binary search tree),也稱為二叉搜尋樹、有序二叉樹(ordered binary tree)或排序二叉樹(sorted binary tree),是指一棵空樹或者具有下列性質的二叉樹:
若任意節點的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;
若任意節點的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;
任意節點的左、右子樹也分別為二叉查詢樹;
沒有鍵值相等的節點。
二叉查詢樹的查詢、插入的時間複雜度較低,為o(log n)
二叉查詢樹的中序遍歷結果是乙個遞增的數列
完整**:bst.py
# 二叉查詢樹的查詢
defsearchbst
(self, root: treenode, x:
int)
-> treenode:
# 如果樹為空,則肯定不存在值為x的節點,返回空
if root is
none
:return
none
p = root
# 當p不空,說明沒有查詢結束
while p is
notnone
:# 如果p的值等於x,則p就是我們要找的節點,返回p
if p.val == x:
return p
# 節點p的值大於x,說明x在p的左子樹
if p.val > x:
p = p.left
# 節點p的值小於x,說明x在p右左子樹
elif p.val < x:
p = p.right
# 若一直查詢到空節點,說明整個樹中沒有值為x的節點,返回空
return
none
# 二叉查詢樹插入,將x插入根節點為root的二叉查詢樹
definsertintobst
(self, root: treenode, x:
int)
-> treenode:
# 樹為空,則直接插入到根節點
if root is
none
: root = treenode(x)
return root
# parent指向當前節點的父節點
p = root
parent = p
while p is
notnone
:if p.val == x:
print
("插入失敗,二叉搜尋樹中已經存在值為x的節點"
)return
none
if p.val > x:
parent = p
p = p.left
elif p.val < x:
parent = p
p = p.right
# 迴圈完成,parent指向p的父節點,值將被插入到parent的左孩子或者右孩子
if parent.val > x:
parent.left = treenode(x)
else
: parent.right = treenode(x)
return root
待刪除的節點(p)是葉子節點(左右孩子均為空),則直接刪除p。
p有且僅有乙個孩子,則將p的父節點和孩子相連,然後刪除p。
p有兩個孩子,則:
將p的直接後繼的值拷貝到p
刪除p的直接後繼
或將p的直接前驅的值拷貝到p
刪除p的直接前驅
直接後繼:節點值大於該節點值並且值最小的節點,也就是右子樹中值最小的節點,也就是右子樹中最左側的節點。
直接前驅:節點值小於該節點值並且值最大的節點,也就是左子樹中值最大的節點,也就是左子樹中最右側的節點。
def
deletenode
(self, root: treenode, key:
int)
->treenode:
# 首先要找到值為key的節點p,用parent記錄p的父節點
p = root
parent = p
while p is
notnone
:if p.val == key:
break
elif p.val > key:
parent = p
p = p.left
elif p.val < key:
parent = p
p = p.right
if p is
none
:print
("樹中沒有值為key的節點,無法刪除!"
)return root
# 到這裡,p是值為key的節點,parent是p的父節點
# 1. 如果p是葉子節點
if p.left is
none
and p.right is
none
:# 判斷p是parent的左孩子還是右孩子
if parent.left is p:
parent.left =
none
elif parent.right is p:
parent.right =
none
# p是根節點
elif parent is p:
return
none
return root
# 2.1 如果p只有左孩子
elif p.left is
notnone
and p.right is
none
:if parent.left is p:
parent.left = p.left
elif parent.right is p:
parent.right = p.left
elif parent is p:
return p.left
return root
# 2.2 如果p只有右孩子
elif p.left is
none
and p.right is
notnone
:if parent.left is p:
parent.left = p.right
elif parent.right is p:
parent.right = p.right
elif parent is p:
return p.right
return root
# 3. 如果p有兩個孩子
elif p.left is
notnone
and p.right is
notnone
:# 3.1. 將p的直接後繼node的值拷貝到p
# 3.1.1 先找到p的直接後繼node,node_parent是nod的父節點
node_parent = p
node = p.right
while node.left is
notnone
: node_parent = node
node = node.left
# 此時node是待刪除節點p的直接後繼,node_parentnode的父節點。
# 3.1.2 將node的值拷貝到p
p.val = node.val
# 3.2. 刪除p的直接後繼node。由於node是p的右子樹的左節點,那麼node肯定沒有左孩子,可能有右孩子。
# 3.2.1 如果node沒有右孩子
if node.right is
none
:if node_parent.left is node:
node_parent.left =
none
elif node_parent.right is node:
node_parent.right =
none
# 3.2.2 如果node有右孩子
elif node.right is
notnone
:if node_parent.left is node:
node_parent.left = node.right
elif node_parent.right is node:
node_parent.right = node.right
return root
二叉查詢樹 插入 刪除 查詢
二叉查詢樹是滿足以下條件的二叉樹 1.左子樹上的所有節點值均小於根節點值,2右子樹上的所有節點值均不小於根節點值,3,左右子樹也滿足上述兩個條件。二叉查詢樹的插入過程如下 1.若當前的二叉查詢樹為空,則插入的元素為根節點,2.若插入的元素值小於根節點值,則將元素插入到左子樹中,3.若插入的元素值不小...
二叉查詢樹 插入 刪除 查詢
二叉查詢樹 插入 刪除 查詢 二叉查詢樹 是滿足以下條件的二叉樹 1.左子樹上的所有節點值均小於根節點值,2右子樹上的所有節點值均不小於根節點值,3,左右子樹也滿足上述兩個條件。二叉查詢樹的插入 過程如下 1.若當前的二叉查詢樹為空,則插入的元素為根節點,2.若插入的元素值小於根節點值,則將元素插入...
python實現二叉查詢樹的查詢 插入 刪除操作
本文用python3實現二叉查詢樹的查詢 插入 刪除操作。完整 查詢操作 先取根節點,如果它等於要查詢的數那就返回。如果要查詢的數比根節點的值小,就在左子樹中遞迴查詢 如果要查詢的數比根節點的值大,那就在右子樹中遞迴查詢。def search self,data res node self.root...