數據結構【二叉搜索樹(BST)】

二叉搜索樹

  • 1. 二叉搜索樹的概念
  • 2. 二叉搜索樹的性能分析
  • 3.二叉搜索樹的插入
  • 4. 二叉搜索樹的查找
  • 5. 二叉搜索樹的刪除
  • 6.二叉搜索樹的實現代碼
  • 7. 二叉搜索樹key和key/value使用場景
    • 7.1 key搜索場景:
    • 7.2 key/value搜索場景:

1. 二叉搜索樹的概念

二叉搜索樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹:

  1. 若它的左子樹不為空,則左子樹上所有結點的值都小于等于根結點的值。
  2. 若它的右子樹不為空,則右子樹上所有結點的值都大于等于根結點的值。
  3. 它的左右子樹也分別為二叉搜索樹。
  4. ?叉搜索樹中可以支持插入相等的值,也可以不支持插入相等的值,具體看使用場景定義,map/set/multimap/multiset系列容器底層就是二叉搜索樹,其中map/set不支持插入相等值,multimap/multiset支持插入相等值。
    在這里插入圖片描述

2. 二叉搜索樹的性能分析

最優情況下,二叉搜索樹為完全二叉樹(或者接近完全二叉樹),其高度為: log2 N
最差情況下,二叉搜索樹退化為單支樹(或者類似單支),其高度為: N
所以綜合而二叉搜索樹增刪查改時間復雜度為: O(N)
在這里插入圖片描述

二分查找也可以實現 O(log2 N) 級別的查找效率,但是二分查找有兩大缺陷:

  1. 需要存儲在支持下標隨機訪問的結構中,并且有序。

  2. 插入和刪除數據效率很低,因為存儲在下標隨機訪問的結構中,插入和刪除數據?般需要挪動數據。

這里也就體現出了平衡二叉搜索樹的價值。

3.二叉搜索樹的插入

  • 樹為空,則直接新增結點,賦值給root指針
  • 樹不空,按二叉搜索樹性質,插入值比當前結點大往右走,插入值比當前結點小往左走找到空位置,插入新結點。
  • 如果支持插入相等的值,插入值跟當前結點相等的值可以往右走,也可以往左走,找到空位置,插入新結點。(要注意的是要保持邏輯一致性,插入相等的值不要一會往右走,一會往左走)

4. 二叉搜索樹的查找

  • 從根開始比較,查找x,x比根的值大則往右邊走查找,x比根值小則往左邊走查找。
  • 最多查找高度次,走到到空,還沒找到,這個值不存在。
  • 如果不支持插入相等的值,找到x即可返回
  • 如果支持插入相等的值,意味著有多個x存在,一般要求查找中序的第一個x。

5. 二叉搜索樹的刪除

首先查找元素是否在二叉搜索樹中,如果不存在,則返回false。
如果查找元素存在則分以下四種情況分別處理:(假設要刪除的結點為N)

  1. 要刪除結點N左右孩子均為空
  2. 要刪除的結點N左孩子位空,右孩子結點不為空
  3. 要刪除的結點N右孩子位空,左孩子結點不為空
  4. 要刪除的結點N左右孩子結點均不為空
    對應以上四種情況的解決方案:
  • 把N結點的父親對應孩子指針指向空,直接刪除N結點(情況1可以當成2或者3處理,效果是一樣的)
  • 把N結點的父親對應孩子指針指向N的右孩子,直接刪除N結點
  • 把N結點的父親對應孩子指針指向N的左孩子,直接刪除N結點
  • 無法直接刪除N結點,因為N的兩個孩子無處安放,只能用替換法
    刪除。找N左子樹的值最大結點R(最右結點)或者N右子樹的值最小結點R(最左結點)替代N,因為這兩個結點中任意一個,放到N的位置,都滿足二叉搜索樹的規則。替代N的意思就是N和R的兩個結點的值交換,轉二變成刪除R結點,R結點符合情況2或情況3,可以直接刪除。
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述

6.二叉搜索樹的實現代碼

template<class K>
struct BSTNode
{K _key;BSTNode<K>* _left;BSTNode<K>* _right;BSTNode(const K& key):_key(key), _left(nullptr), _right(nullptr){}
};
// Binary Search Tree
template<class K>
class BSTree
{typedef BSTNode<K> Node;
public:bool Insert(const K& key){if (_root == nullptr){_root = new Node(key);return true;}Node* parent = nullptr;Node* cur = _root;while (cur){if (cur->_key < key){parent = cur;cur = cur->_right;}else if (cur->_key > key){parent = cur;cur = cur->_left;}else{				return false;}}cur = new Node(key);if (parent->_key < key){parent->_right = cur;}else{parent->_left = cur;}return true;}bool Find(const K& key){Node* cur = _root;while (cur){if (cur->_key < key){cur = cur->_right;}else if (cur->_key > key){cur = cur->_left;}else{return true;}}return false;}bool Erase(const K& key){Node* parent = nullptr;Node* cur = _root;while (cur){if (cur->_key < key){parent = cur;cur = cur->_right;}else if (cur->_key > key){parent = cur;cur = cur->_left;}else{// 0-1個孩?的情況// 刪除情況1 2 3均可以直接刪除,改變?親對應孩?指針指向即可if (cur->_left == nullptr){if (parent == nullptr){_root = cur->_right;}else{if (parent->_left == cur)parent->_left = cur->_right;elseparent->_right = cur->_right;}delete cur;return true;}else if (cur->_right == nullptr){if (parent == nullptr){_root = cur->_left;}else{if (parent->_left == cur)parent->_left = cur->_left;elseparent->_right = cur->_left;}delete cur;return true;}else				{// 2個孩?的情況// 刪除情況4,替換法刪除// 假設這?我們取右?樹的最?結點作為替代結點去刪除// 這?尤其要注意右?樹的根就是最?情況的情況的處理,對應課件圖中刪8的情況// ?定要把cur給rightMinP,否會報錯。Node * rightMinP = cur;Node* rightMin = cur->_right;while (rightMin->_left){rightMinP = rightMin;rightMin = rightMin->_left;}cur->_key = rightMin->_key;if (rightMinP->_left == rightMin)rightMinP->_left = rightMin->_right;elserightMinP->_right = rightMin->_right;delete rightMin;return true;}}}return false;}void InOrder(){_InOrder(_root);cout << endl;}
private:void _InOrder(Node* root){if (root == nullptr){return;}_InOrder(root->_left);cout << root->_key << " ";_InOrder(root->_right);}private:Node * _root = nullptr;};

7. 二叉搜索樹key和key/value使用場景

7.1 key搜索場景:

場景1:小區無人值守車庫,那么物業會把買了車位的業主的
車牌號錄入后臺系統,車輛進入時掃描車牌在不在系統中,在則抬桿,不在則提示非本小區車輛,無法進入。
場景2:檢查?篇英文章單詞拼寫是否正確,將詞庫中所有單詞放?二叉搜索樹,讀取文章中的單詞,查找是否在二叉搜索樹中,不在則波浪線標紅提示。

7.2 key/value搜索場景:

每一個關鍵碼key,都有與之對應的值value,value可以任意類型對象。樹的結構中(結點)除了需要存儲key還要存儲對應的value,增/刪/查還是以key為關鍵字走二叉搜索樹的規則進行比較,可以快速查
找到key對應的value。key/value的搜索場景實現的二叉樹搜索樹支持修改,但是不支持修改key,修改key破壞搜索樹性質了,可以修改value。
場景1:簡單中英互譯字典,樹的結構中(結點)存儲key(英?)和vlaue(中文),搜索時輸入英文,則同時查找到了英文對應的中文。
場景2:商場無人值守車庫,入口進場時掃描車牌,記錄車牌和入場時間,出口離場時,掃描車牌,查找入場時間,用當前時間-入場時間計算出停車時長,計算出停車費用,繳費后抬桿,車輛離場。
場景3:統計?篇?章中單詞出現的次數,讀取?個單詞,查找單詞是否存在,不存在這個說明第一次出現,(單詞,1),單詞存在,則++單詞對應的次數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82280.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82280.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82280.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RDMA高性能網絡通信實踐

RDMA高性能網絡通信實踐 一、背景介紹二、方法設計A.實現方案B.關鍵技術點 三、代碼及注釋四、注意事項 一、背景介紹 遠程直接內存訪問&#xff08;RDMA&#xff09;技術通過繞過操作系統內核和CPU直接訪問遠程內存&#xff0c;實現了超低延遲、高吞吐量的網絡通信。該技術廣…

ndarray數組掩碼操作,True和False獲取數據

#數組掩碼的表示方法 def testht05():a np.arange(1,10)mask [True,False,True,True,False,True,False,True,True]print(a[mask]) 另外的用法&#xff1a; #掩碼操作獲取子集 def testht06():a np.arange(1,100)print(a[a%3 0 & (a%7 0)] )b np.array([A,"B&qu…

索引工具explain

EXPLAIN 是 MySQL 中一個非常有用的工具,用于分析查詢的執行計劃。通過 EXPLAIN,你可以了解 MySQL 是如何執行查詢的,包括它如何使用索引、表的掃描方式等。這有助于優化查詢性能。以下是 EXPLAIN 輸出的各個字段的詳細解釋: 基本用法 EXPLAIN SELECT * FROM table_name …

Git回顧

參考視頻:【GeekHour】一小時Git教程 一句話定義&#xff1a;Git是一個免費開源的分布式版本控制系統。 版本控制系統可以分為兩種&#xff0c;1.集中式&#xff08;SVN&#xff0c;CVS&#xff09;&#xff1b;2.分布式&#xff08;git&#xff09; git的工作區域和文件狀態…

python打卡day20

特征降維------特征組合&#xff08;以SVD為例&#xff09; 知識點回顧&#xff1a; 奇異值的應用&#xff1a; 特征降維&#xff1a;對高維數據減小計算量、可視化數據重構&#xff1a;比如重構信號、重構圖像&#xff08;可以實現有損壓縮&#xff0c;k 越小壓縮率越高&#…

GuPPy-v1.2.0安裝與使用-生信工具52

GuPPy&#xff1a;Python中用于光纖光度數據分析的免費開源工具 01 背景 Basecalling 是將原始測序信號轉換為堿基序列的過程&#xff0c;通俗地說&#xff0c;就是“把堿基識別出來”。這一過程在不同代測序技術中各不相同&#xff1a; 一代測序是通過解析峰圖實現&#xff1…

47. 全排列 II

題目 給定一個可包含重復數字的序列 nums &#xff0c;按任意順序 返回所有不重復的全排列。 示例 1&#xff1a; 輸入&#xff1a;nums [1,1,2] 輸出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]] 示例 2&#xff1a; 輸入&#xff1a;nums [1,2,3] 輸出&#xff1a;[[1,2,3…

ERP系統操作流程,如何快速搭建流程體系

ERP流程圖&#xff0c;如何搭建和建立&#xff0c;ERP系統操作流程&#xff0c;ERP系統操作流程圖&#xff0c;采購流程&#xff0c;銷售流程&#xff0c;倉庫流程&#xff0c;MRP流程&#xff0c;PMC流程&#xff0c;財務流程&#xff0c;應收流程&#xff0c;應付流程&#x…

class path resource [] cannot be resolved to absolute file path

問題情景 java應用程序在IDE運行正常&#xff0c;打成jar包后執行卻發生異常&#xff1a; java.io.FileNotFoundException: class path resource [cert/sync_signer_pri_test.key] cannot be resolved to absolute file path because it does not reside in the file system:…

19、HashTable(哈希)、位圖的實現和布隆過濾器的介紹

一、了解哈希【散列表】 1、哈希的結構 在STL中&#xff0c;HashTable是一個重要的底層數據結構, 無序關聯容器包括unordered_set, unordered_map內部都是基于哈希表實現 哈希表又稱散列表&#xff0c;一種以「key-value」形式存儲數據的數據結構。哈希函數&#xff1a;負責將…

基于 Flask的深度學習模型部署服務端詳解

基于 Flask 的深度學習模型部署服務端詳解 在深度學習領域&#xff0c;訓練出一個高精度的模型只是第一步&#xff0c;將其部署到生產環境中&#xff0c;為實際業務提供服務才是最終目標。本文將詳細解析一個基于 Flask 和 PyTorch 的深度學習模型部署服務端代碼&#xff0c;幫…

Vue3 + Node.js 實現客服實時聊天系統(WebSocket + Socket.IO 詳解)

Node.js 實現客服實時聊天系統&#xff08;WebSocket Socket.IO 詳解&#xff09; 一、為什么選擇 WebSocket&#xff1f; 想象一下淘寶客服的聊天窗口&#xff1a;你發消息&#xff0c;客服立刻就能看到并回復。這種即時通訊效果是如何實現的呢&#xff1f;我們使用 Vue3 作…

MySQL數據庫與表結構操作指南

前言&#xff1a;本文系統梳理MySQL核心操作語句。內容覆蓋建庫建表、結構調整、數據遷移全流程&#xff08;包含創建/修改/刪除/備份場景&#xff09;。希望它們能幫你快速解決問題。 庫結構操作 一、庫的創建 一個庫的簡單創建&#xff1a; create database 庫名; 注意&am…

【WEB3】區塊鏈、隱私計算、AI和Web3.0——數據民主化(1)

區塊鏈、隱私計算、AI&#xff0c;是未來Web3.0至關重要的三項技術。 1.數據民主化問題 數據在整個生命周期&#xff08;生產、傳輸、處理、存儲&#xff09;內的隱私安全&#xff0c;則是Web3.0在初始階段首要解決的問題。 數據民主化旨在打破數據壟斷&#xff0c;讓個體能…

C語言—指針2

1. const 修飾變量 1.1 const修飾變量 變量被const修飾時&#xff0c;變量此時為常變量&#xff0c;本質為常量&#xff0c;語法上不可被修改&#xff0c;但是如果此時需要修改變量值&#xff0c;可以通過指針的方式修改。 雖然此時通過指針的方式確實修改了變量的值&#xff…

高級架構軟考之網絡OSI網絡模型

高級架構軟考之網絡&#xff1a; 1.OSI網絡模型&#xff1a; a.物理層&#xff1a; a.物理傳輸介質物理連接&#xff0c;負責數據傳輸&#xff0c;并監控數據 b.傳輸單位&#xff1a;bit c.協議&#xff1a; d:對應設備&#xff1a;中繼器、集線器 b.數據鏈路層&#xff1a; a.…

el-table計算表頭列寬,不換行顯示

1、在utils.js中封裝renderHeader方法 2、在el-table-column中引入&#xff1a; 3、頁面展示&#xff1a;

MySQL OCP和Oracle OCP怎么選?

近期oracle 為慶祝 MySQL 數據庫發布 30 周年&#xff0c;Oracle 官方推出限時福利&#xff1a;2025 年 4 月 20 日至 7 月 31 日期間&#xff0c;所有人均可免費報考 MySQL OCP&#xff08;Oracle Certified Professional&#xff09;認證考試&#xff08;具體可查看MySQL OCP…

2025最新免費視頻號下載工具!支持Win/Mac,一鍵解析原畫質+封面

軟件介紹 適用于Windows 2025 最新5月蝴蝶視頻號下載工具&#xff0c;免費使用&#xff0c;無廣告且免費&#xff0c;支持對原視頻和封面進行解析下載&#xff0c;親測可用&#xff0c;現在很多工具都失效了&#xff0c;難得的幾款下載視頻號工具&#xff0c;大家且用且珍…

Python學習之路(八)-多線程和多進程淺析

在 Python 中,多線程(Multithreading) 和 多進程(Multiprocessing) 是實現并發編程的兩種主要方式。它們各有優劣,適用于不同的場景。 一、基本概念 特性多線程(threading)多進程(multiprocessing)并發模型線程共享內存空間每個進程擁有獨立內存空間GIL(全局解釋器鎖…