二叉查詢樹的查詢 插入 刪除

2021-10-14 13:39:31 字數 4271 閱讀 8570

二叉查詢樹(英語: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...