二叉搜索樹(BST)---python實現


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM