github:代碼實現
本文算法均使用python3實現
1. 二叉搜索樹定義
二叉搜索樹(Binary Search Tree),又名二叉排序樹(Binary Sort Tree)。
二叉搜索樹是具有有以下性質的二叉樹:
(1)若左子樹不為空,則左子樹上所有節點的值均小於或等於它的根節點的值。
(2)若右子樹不為空,則右子樹上所有節點的值均大於或等於它的根節點的值。
(3)左、右子樹也分別為二叉搜索樹。
2. 二叉搜索樹的相關操作
2.1 插入操作
從根節點開始,若插入的值比根節點的值小,則將其插入根節點的左子樹;若比根節點的值大,則將其插入根節點的右子樹。該操作可使用遞歸進行實現。

程序代碼:
def insert(self, root, val):
'''二叉搜索樹插入操作'''
if root == None:
root = TreeNode(val)
elif val < root.val:
root.left = self.insert(root.left, val)
elif val > root.val:
root.right = self.insert(root.right, val)
return root
2.2 查詢操作
從根節點開始查找,待查找的值是否與根節點的值相同,若相同則返回True;否則,判斷待尋找的值是否比根節點的值小,若是則進入根節點左子樹進行查找,否則進入右子樹進行查找。該操作使用遞歸實現。
程序代碼:
def query(self, root, val):
'''二叉搜索樹查詢操作'''
if root == None:
return False
if root.val == val:
return True
elif val < root.val:
return self.query(root.left, val)
elif val > root.val:
return self.query(root.right, val)
2.3 查找二叉搜索樹中的最大(小值)
(1)查找最小值:從根節點開始,沿着左子樹一直往下,直到找到最后一個左子樹節點,按照定義可知,該節點一定是該二叉搜索樹中的最小值節點。
程序代碼:
def findMin(self, root):
'''查找二叉搜索樹中最小值點'''
if root.left:
return self.findMin(root.left)
else:
return root
(2)查找最大值:從根節點開始,沿着右子樹一直往下,直到找到最后一個右子樹節點,按照定義可知,該節點一定是該二叉搜索樹中的最大值節點。
程序代碼:
def findMax(self, root):
'''查找二叉搜索樹中最大值點'''
if root.right:
return self.findMax(root.right)
else:
return root
2.4 刪除節點操作
對二叉搜索樹節點的刪除操作分為以下三種情況:
(1)待刪除節點既無左子樹也無右子樹:直接刪除該節點即可

(2)待刪除節點只有左子樹或者只有右子樹:將其左子樹或右子樹根節點代替待刪除節點

(3)待刪除節點既有左子樹也有右子樹:找到該節點右子樹中最小值節點,使用該節點代替待刪除節點,然后在右子樹中刪除最小值節點。

程序代碼:
def delNode(self, root, val):
'''刪除二叉搜索樹中值為val的點'''
if root == None:
return
if val < root.val:
root.left = self.delNode(root.left, val)
elif val > root.val:
root.right = self.delNode(root.right, val)
# 當val == root.val時,分為三種情況:只有左子樹或者只有右子樹、有左右子樹、即無左子樹又無右子樹
else:
if root.left and root.right:
# 既有左子樹又有右子樹,則需找到右子樹中最小值節點
temp = self.findMin(root.right)
root.val = temp.val
# 再把右子樹中最小值節點刪除
root.right = self.delNode(root.right, temp.val)
elif root.right == None and root.left == None:
# 左右子樹都為空
root = None
elif root.right == None:
# 只有左子樹
root = root.left
elif root.left == None:
# 只有右子樹
root = root.right
return root
2.5 打印操作
實現二叉搜索樹的中序遍歷,並打印出來。該方法打印出來的數列將是按照遞增順序排列。
程序代碼:
def printTree(self, root):
# 打印二叉搜索樹(中序打印,有序數列)
if root == None:
return
self.printTree(root.left)
print(root.val, end = ' ')
self.printTree(root.right)
引用及參考:
[1]《數據結構》李春葆著
[2] https://blog.csdn.net/u010089444/article/details/70854510?utm_source=itdadao&utm_medium=referral
寫在最后:本文參考以上資料進行整合與總結,屬於原創,文章中可能出現理解不當的地方,若有所見解或異議可在下方評論,謝謝!
若需轉載請注明:https://www.cnblogs.com/lliuye/p/9118591.html
