python如何實(shí)現(xiàn)二叉搜索樹(shù)算法
二叉搜索樹(shù)算法介紹
二叉搜索樹(shù)(Binary Search Tree,簡(jiǎn)稱(chēng)BST)是一種常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),它支持一系列的動(dòng)態(tài)集合操作,包括搜索、插入、刪除和遍歷等。
在二叉搜索樹(shù)中,對(duì)于樹(shù)中的每個(gè)節(jié)點(diǎn)X,其左子樹(shù)中的所有項(xiàng)的值都小于X中的項(xiàng),而其右子樹(shù)中的所有項(xiàng)的值都大于X中的項(xiàng)。
1. 二叉搜索樹(shù)的性質(zhì)
- 唯一根節(jié)點(diǎn):非空二叉搜索樹(shù)有一個(gè)根節(jié)點(diǎn)。
- 左子樹(shù):對(duì)于樹(shù)中的每個(gè)節(jié)點(diǎn)X,其左子樹(shù)中的所有項(xiàng)的值都小于X中的項(xiàng)。
- 右子樹(shù):對(duì)于樹(shù)中的每個(gè)節(jié)點(diǎn)X,其右子樹(shù)中的所有項(xiàng)的值都大于X中的項(xiàng)。
- 中序遍歷:對(duì)二叉搜索樹(shù)進(jìn)行中序遍歷(左-根-右)可以得到一個(gè)按升序排列的節(jié)點(diǎn)值的序列。
2. 基本操作
插入
- 從根節(jié)點(diǎn)開(kāi)始。
- 如果要插入的值小于當(dāng)前節(jié)點(diǎn)的值,移動(dòng)到左子樹(shù)。
- 如果要插入的值大于當(dāng)前節(jié)點(diǎn)的值,移動(dòng)到右子樹(shù)。
- 重復(fù)步驟2和3,直到找到一個(gè)空位置插入新節(jié)點(diǎn)。
搜索
- 從根節(jié)點(diǎn)開(kāi)始。
- 如果要搜索的值小于當(dāng)前節(jié)點(diǎn)的值,移動(dòng)到左子樹(shù)。
- 如果要搜索的值大于當(dāng)前節(jié)點(diǎn)的值,移動(dòng)到右子樹(shù)。
- 重復(fù)步驟2和3,直到找到值相等或到達(dá)葉子節(jié)點(diǎn)(無(wú)子節(jié)點(diǎn))。
刪除
刪除操作稍微復(fù)雜一些,因?yàn)樗枰幚砣N情況:
- 要?jiǎng)h除的節(jié)點(diǎn)是葉子節(jié)點(diǎn):直接刪除該節(jié)點(diǎn),并修改其父節(jié)點(diǎn)的鏈接。
- 要?jiǎng)h除的節(jié)點(diǎn)有一個(gè)子節(jié)點(diǎn):用其子節(jié)點(diǎn)替換該節(jié)點(diǎn),并修改其父節(jié)點(diǎn)的鏈接。
- 要?jiǎng)h除的節(jié)點(diǎn)有兩個(gè)子節(jié)點(diǎn):找到該節(jié)點(diǎn)的右子樹(shù)中的最小節(jié)點(diǎn)(或左子樹(shù)中的最大節(jié)點(diǎn)),用該節(jié)點(diǎn)的值替換要?jiǎng)h除的節(jié)點(diǎn)的值,并刪除右子樹(shù)中的最小節(jié)點(diǎn)(或左子樹(shù)中的最大節(jié)點(diǎn))。
3. 示例代碼(Python)
這里僅提供一個(gè)非?;镜牟迦牒退阉鞯氖纠a:
class TreeNode:
def __init__(self, key):
self.left = None
self.right = None
self.val = key
class BinarySearchTree:
def __init__(self):
self.root = None
def insert(self, key):
if self.root is None:
self.root = TreeNode(key)
else:
self._insert_rec(self.root, key)
def _insert_rec(self, root, key):
if key < root.val:
if root.left is None:
root.left = TreeNode(key)
else:
self._insert_rec(root.left, key)
elif key > root.val:
if root.right is None:
root.right = TreeNode(key)
else:
self._insert_rec(root.right, key)
def search(self, key):
return self._search_rec(self.root, key)
def _search_rec(self, root, key):
if root is None or root.val == key:
return root is not None
if key < root.val:
return self._search_rec(root.left, key)
return self._search_rec(root.right, key)
# 使用示例
bst = BinarySearchTree()
bst.insert(50)
bst.insert(30)
bst.insert(20)
bst.insert(40)
bst.insert(70)
bst.insert(60)
bst.insert(80)
print(bst.search(40)) # 輸出: True
print(bst.search(25)) # 輸出: False請(qǐng)注意:
- 這個(gè)示例代碼只實(shí)現(xiàn)了插入和搜索功能,并沒(méi)有實(shí)現(xiàn)刪除操作。
- 刪除操作需要更多的邏輯來(lái)處理不同的情況。
二叉搜索樹(shù)算法python實(shí)現(xiàn)樣例
下面是一個(gè)簡(jiǎn)單的 Python 實(shí)現(xiàn)二叉搜索樹(shù)的算法:
# 定義二叉搜索樹(shù)的節(jié)點(diǎn)
class Node:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
# 定義二叉搜索樹(shù)
class BinarySearchTree:
def __init__(self):
self.root = None
# 插入節(jié)點(diǎn)
def insert(self, value):
if self.root is None:
self.root = Node(value)
else:
self._insert_recursive(self.root, value)
def _insert_recursive(self, node, value):
if value < node.value:
if node.left is None:
node.left = Node(value)
else:
self._insert_recursive(node.left, value)
else:
if node.right is None:
node.right = Node(value)
else:
self._insert_recursive(node.right, value)
# 查找節(jié)點(diǎn)
def find(self, value):
return self._find_recursive(self.root, value)
def _find_recursive(self, node, value):
if node is None or node.value == value:
return node
if value < node.value:
return self._find_recursive(node.left, value)
return self._find_recursive(node.right, value)
# 刪除節(jié)點(diǎn)
def delete(self, value):
self.root = self._delete_recursive(self.root, value)
def _delete_recursive(self, node, value):
if node is None:
return node
if value < node.value:
node.left = self._delete_recursive(node.left, value)
elif value > node.value:
node.right = self._delete_recursive(node.right, value)
else:
# 找到要?jiǎng)h除的節(jié)點(diǎn)
if node.left is None:
return node.right
elif node.right is None:
return node.left
else:
# 找到右子樹(shù)中的最小節(jié)點(diǎn),替換當(dāng)前節(jié)點(diǎn)
min_node = self._find_min(node.right)
node.value = min_node.value
node.right = self._delete_recursive(node.right, min_node.value)
return node
def _find_min(self, node):
while node.left is not None:
node = node.left
return node
# 中序遍歷
def inorder_traversal(self):
self._inorder_traversal_recursive(self.root)
def _inorder_traversal_recursive(self, node):
if node is not None:
self._inorder_traversal_recursive(node.left)
print(node.value, end=" ")
self._inorder_traversal_recursive(node.right)使用方法:
bst = BinarySearchTree() bst.insert(8) bst.insert(3) bst.insert(10) bst.insert(1) bst.insert(6) bst.insert(14) bst.insert(4) bst.insert(7) bst.insert(13) bst.inorder_traversal() # 輸出:1 3 4 6 7 8 10 13 14 bst.delete(8) bst.inorder_traversal() # 輸出:1 3 4 6 7 10 13 14 node = bst.find(6) print(node.value) # 輸出:6
這是一個(gè)基本的二叉搜索樹(shù)算法實(shí)現(xiàn),包括插入、查找、刪除和中序遍歷操作。你可以根據(jù)需要進(jìn)一步擴(kuò)展和優(yōu)化這個(gè)實(shí)現(xiàn)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
簡(jiǎn)單的Python人臉識(shí)別系統(tǒng)
這篇文章主要介紹了Python人臉識(shí)別系統(tǒng)的實(shí)現(xiàn),文中講解非常詳細(xì),代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
Python操作JSON實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)交換
這篇文章主要介紹了Python操作JSON實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)交換,JSON的全稱(chēng)是 JavaScript Object Notation,是一種輕量級(jí)的數(shù)據(jù)交換格式,關(guān)于JSON的更多相關(guān)內(nèi)容感興趣的小伙伴可以參考一下2022-06-06
Python利用Turtle庫(kù)繪制一顆櫻花樹(shù)
后唐李煜曾說(shuō)道,櫻花落盡春將困,秋千架下歸時(shí)。漏暗斜月遲遲,花在枝。櫻花落盡的時(shí)候春天也將過(guò)去了,秋千架下歸去時(shí)。天上的斜月姍姍來(lái)遲,花還在枝頭。本文將用Python+Turtle繪制一顆櫻花樹(shù),感興趣的可以嘗試一下2022-04-04
Python使用mmap實(shí)現(xiàn)內(nèi)存映射文件操作
內(nèi)存映射通常可以提高I/O的性能,本文主要介紹了Python使用mmap實(shí)現(xiàn)內(nèi)存映射文件操作,分享給大家,感興趣的可以了解一下2021-06-06
python接口自動(dòng)化測(cè)試之接口數(shù)據(jù)依賴(lài)的實(shí)現(xiàn)方法
這篇文章主要介紹了python接口自動(dòng)化測(cè)試之接口數(shù)據(jù)依賴(lài)的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
python抓取某汽車(chē)網(wǎng)數(shù)據(jù)解析html存入excel示例
python抓取某汽車(chē)網(wǎng)經(jīng)銷(xiāo)商信息網(wǎng)頁(yè)數(shù)據(jù)解析html,這里提供一個(gè)示例演示,大家可以根據(jù)需要分析自己網(wǎng)站的數(shù)據(jù)2013-12-12
python configparser中默認(rèn)值的設(shè)定方式
這篇文章主要介紹了python configparser中默認(rèn)值的設(shè)定方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Python中五種不同解析庫(kù)的應(yīng)用與提取速度對(duì)比
這篇文章主要為大家詳細(xì)介紹了Python中五種不同解析庫(kù)的應(yīng)用與提取速度對(duì)比,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-05-05
Python開(kāi)發(fā)時(shí)報(bào)TypeError:?‘int‘?object?is?not?iterable錯(cuò)誤的解決方
Python寫(xiě)循環(huán)程序的時(shí)候遇到TypeError:'int'object is not iterable,所以下面這篇文章主要給大家介紹了關(guān)于Python開(kāi)發(fā)時(shí)報(bào)TypeError:'int'?object?is?not?iterable錯(cuò)誤的解決方式,需要的朋友可以參考下2022-06-06

