【Python数据结构】——二叉查找树(查找、构建、删除、插入、打印)
生活随笔
收集整理的這篇文章主要介紹了
【Python数据结构】——二叉查找树(查找、构建、删除、插入、打印)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/7/15 0:34
# @Author : @linlianqin
# @Site :
# @File : 二叉查找樹類實(shí)現(xiàn)(查找、創(chuàng)建、刪除、插入、遍歷).py
# @Software: PyCharm
# @description:class TreeNode:def __init__(self, val, left=None, right=None):self.val = valself.left = leftself.right = rightclass BST_operation:# 二叉查找數(shù)元素查找# 思路:根據(jù)二叉查找樹的左小右大的特性,當(dāng)當(dāng)前結(jié)點(diǎn)值大于target則說(shuō)明值在左子樹,否則在右子樹def BST_search(self,root, target):# 當(dāng)訪問到最后得到的是None,說(shuō)明元素不存在查找樹上if root == None:return False# 當(dāng)當(dāng)前結(jié)點(diǎn)值等于target時(shí)查找成功if root.val == target:return True# 當(dāng)結(jié)點(diǎn)值小于target時(shí),說(shuō)明目標(biāo)有可能存在右子樹elif root.val < target:return self.BST_search(root.right, target)# 當(dāng)結(jié)點(diǎn)值小于target時(shí),說(shuō)明目標(biāo)有可能存在右子樹if root.val > target:return self.BST_search(root.left, target)# 二叉查找數(shù)元素插入# 思路:根據(jù)二叉查找樹的左小右大的特性,當(dāng)當(dāng)前結(jié)點(diǎn)值大于target則說(shuō)明值插入到,否則在右子樹# 當(dāng)root == None時(shí),說(shuō)明就是插入的位置def BST_insert(self,root, target):# 當(dāng)值為None,創(chuàng)建新結(jié)點(diǎn)if root == None:root = TreeNode(target)# 存在時(shí)elif root.val == target:passelif root.val < target:root.right = self.BST_insert(root.right, target)elif root.val > target:root.left = self.BST_insert(root.left, target)return root# 二叉查找樹構(gòu)建# 根據(jù)列表進(jìn)行二叉查找數(shù)的建立# 思路:新建一個(gè)None結(jié)點(diǎn)作為初始頭結(jié)點(diǎn),然后進(jìn)行后面元素的插入def BST_create(self,li):if len(li) != 0:root = TreeNode(li[0])else:return Nonefor i in range(1, len(li)):self.BST_insert(root, li[i])return root# 二叉查找樹的刪除# 刪除根節(jié)點(diǎn)的處理方法,為了保證刪除根節(jié)點(diǎn)后依舊是一顆完整的二叉查找樹,這里可以用左子樹中的最大值和右子樹中的最小值來(lái)代替根節(jié)點(diǎn),然后在子樹中刪除相應(yīng)的葉節(jié)點(diǎn)# 1)若root值為None,說(shuō)明二叉樹中不存在要?jiǎng)h除的值# 2)若root值剛好是target,說(shuō)明已經(jīng)找到了要?jiǎng)h除的結(jié)點(diǎn),進(jìn)行刪除處理操作:# a) 如果root沒有左右子樹了,直接刪除結(jié)點(diǎn)即可# b)如果root還有左子樹,則尋找左子樹中的最大值,用于替換root,然后在左子樹中刪除結(jié)點(diǎn)# c) 如果root還有右子樹,則尋找右子樹的最小樹,用于替換root,然后在右子樹中刪除結(jié)點(diǎn)# 3)如果root值大于target,target可能在左子樹,遞歸# 4)如果root值小于target,target可能在右子樹,遞歸## 尋找二叉查找樹以root為根節(jié)點(diǎn)的最小權(quán)值def BST_search_min(self,root):if root.left:return self.BST_search_min(root.left)else:return root## 尋找二叉查找樹以root為根節(jié)點(diǎn)的最大權(quán)值def BST_search_max(self,root):if root.right:return self.BST_search_max(root.right)else:return root## 刪除def BST_delete(self,root, target):# todo:這里可選# 1)若root值為None,說(shuō)明二叉樹中不存在要?jiǎng)h除的值if root.val == None:return# 2)如果root值大于target,target可能在左子樹,遞歸elif root.val > target:root.left = self.BST_delete(root.left, target)# 3)如果root值小于target,target可能在右子樹,遞歸elif root.val < target:root.right = self.BST_delete(root.right, target)# 4)若root值剛好是target,說(shuō)明已經(jīng)找到了要?jiǎng)h除的結(jié)點(diǎn),進(jìn)行刪除處理操作:if root.val == target:# a) 如果root沒有左右子樹了,直接刪除結(jié)點(diǎn)即可if root.left is None and root.right is None:root = None# b)如果root還有左子樹,則尋找左子樹中的最大值,用于替換root,然后在左子樹中刪除結(jié)點(diǎn)elif root.left is not None:root = root.left# c) 如果root還有右子樹,則尋找右子樹的最小樹,用于替換root,然后在右子樹中刪除結(jié)點(diǎn)elif root.right is not None:root = root.rightreturn root# 遍歷二叉查找數(shù),中序遍歷def BST_mid_scan(self,root):if root is None:return# 遍歷左子樹self.BST_mid_scan(root.left)# 遍歷根節(jié)點(diǎn)print(root.val, end=',')self.BST_mid_scan(root.right)if __name__ == '__main__':li = [5,3,7,4,2,8,6]print('li:',li)BST = BST_operation()print('構(gòu)建二叉查找樹--------------------')root = BST.BST_create(li)BST.BST_mid_scan(root)# 插入print("\n插入1--------------------------")BST.BST_insert(root,1)BST.BST_mid_scan(root)# 刪除print("\n刪除6----------------------")BST.BST_delete(root,6)BST.BST_mid_scan(root)# 查找print("\n查找--------------------------------")print("在二叉樹中查找10:",BST.BST_search(root,10))print("在二叉樹中查找5:",BST.BST_search(root,5))
li: [5, 3, 7, 4, 2, 8, 6]
構(gòu)建二叉查找樹--------------------
2,3,4,5,6,7,8,
插入1--------------------------
1,2,3,4,5,6,7,8,
刪除6----------------------
1,2,3,4,5,7,8,
查找--------------------------------
在二叉樹中查找10: False
在二叉樹中查找5: True
參考:
https://blog.csdn.net/ca___0/article/details/111385872
https://blog.csdn.net/u010089444/article/details/70854510
胡凡——算法筆記
總結(jié)
以上是生活随笔為你收集整理的【Python数据结构】——二叉查找树(查找、构建、删除、插入、打印)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IMX8基于FFT的GPU和CPU的性能
- 下一篇: 国二python考试系统_分享自己的国二