數據結構*搜索樹

什么是搜索樹

搜索樹是一種樹形數據結構,用于高效地存儲和檢索數據。其核心特點是每個節點包含一個鍵(Key),并遵循特定的排序規則。常見的搜索樹有二叉搜索樹、自平衡二叉樹、多叉搜索樹等。AVL樹、紅黑樹、Splay樹都屬于自平衡二叉樹。

二叉搜索樹

什么是二叉搜索樹

1、是一棵二叉樹
2、左子樹所有節點值的大小 < 當前節點值的大小
3、右子樹所有節點值的大小 > 當前節點值的大小
4、子樹也滿足上述條件
下圖就是一棵二叉搜索樹:
在這里插入圖片描述
根據二叉搜索樹的性質,當我們中序遍歷這棵樹的時候,發現它是按照順序進行排序的。(上面中序排序為:10、20、30、40、50、60、70、80)

二叉搜索樹的基本操作

查找

根據二叉搜索樹的性質,“左邊的值”都比節點的值小,“右邊的值”都比節點的值大。這樣我們查找的時候就可以直接排除了一邊子樹。

代碼展示:
public TreeNode search(int key) {if(root == null) {return null;}TreeNode cur = root;while (cur != null) {if(cur.value == key) {return cur;}else if(cur.value > key) {//說明key在左樹cur = cur.left;}else {//說明key在右樹cur = cur.right;}}return null;//當整棵樹都沒有找到key,返回null
}
代碼分析:

時間復雜度:最好情況下(根節點就是要找的):O(1);平均情況下:O(logN) —> 每次比較可以排除一半的節點,類似二分查找;最壞情況下(樹是一棵單邊樹,也看成鏈表):O(N) -----> 需要遍歷每個節點。

為了解決二叉搜索樹存在的問題,就有了AVL樹、紅黑樹

插入

插入數據后,還是要滿足二叉搜索樹的性質的。插入操作一般都是在葉子節點位置進行的。這是為了保證插入后樹依然保持二叉搜索樹的性質,并且不需要對已有的其他節點結構進行調整。

代碼展示:
public boolean insert(int val) {TreeNode node = new TreeNode(val);//當二叉樹為空,直接插入if(root == null) {root = node;return true;}TreeNode cur = root;//用來找到遍歷二叉樹TreeNode prev = null;//用來找到cur父親節點while (cur != null) {if(cur.value == val) {return false;}else if(cur.value > val) {prev = cur;cur = cur.left;//根據性質,需要在左子樹進行插入,cur向左子樹移動。}else {prev = cur;cur = cur.right;//根據性質,需要在右子樹進行插入,cur向右子樹移動。}}//此時cur為null,prev指向cur父親節點//根據prev的值決定將新節點插入左子樹還是右子樹if(prev.value > val) {prev.left = node;}else {prev.right = node;}return true;
}
代碼分析:

時間復雜度:平均情況下:O(logN);最壞情況下(樹是一棵單邊樹,也看成鏈表):O(N)。

刪除

代碼展示:
public void remove(int val) {if(root == null) {return;}TreeNode cur = root;TreeNode parent = null;if(cur.val > val) {parent = cur;cur = cur.left;}else if(cur.val < val) {parent = cur;cur = cur.right;}else {parent = cur;removeNode(cur,parent);//通過上述代碼找到要刪除的節點,再通過removeNode(cur,parent)方法刪除節點}
}
//刪除節點的方法
private void removeNode(TreeNode cur, TreeNode parent) {//1、cur.left == null:要刪除的節點只有右節點if(cur.left == null) {if(cur == root) { //1.1、cur為root,則root = cur.rightroot = cur.right;//要刪除的為根節點,根節點往后移}else {if(cur == parent.right) {//1.2、cur不為root,cur為父親節點(parent)的右結點parent.right = cur.right;//讓parent的右節點指向cur的右節點,跳過cur}else {//1.3、cur不為root,cur為父親節點(parent)的左結點parent.left = cur.right;//讓parent的左節點指向cur的右節點,跳過cur}}}else if(cur.right == null) {//2、cur.right == nullif(cur == root) { //2.1、cur為root,則root = cur.leftroot = cur.left;//要刪除的為根節點,根節點往后移}else {if(cur == parent.right) {//2.2、cur不為root,cur為父親節點(parent)的右結點parent.right = cur.left;//讓parent的右節點指向cur的左節點,跳過cur}else {//2.3、cur不為root,cur為父親節點(parent)的左結點parent.left = cur.left;//讓parent的左節點指向cur的左節點,跳過cur}}}else {//3、cur.left != null && cur.right != null//這里的刪除相當于替換刪除。在以cur為root的樹中,在右樹找到最左邊的節點(或者在左樹找到最右邊的節點)TreeNode target = cur.right;TreeNode targetParent = cur;while (target.left != null) {//在右樹找到最左邊的節點targettargetParent = target;target = target.left;}cur.val = target.val;//target在targetParent的左右子樹位置不一樣,刪除方式不一樣if(target == targetParent.left) {targetParent.left = target.right;}else {targetParent.right = target.right;}}
}
代碼分析:

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

語音交互新紀元:Hugging Face LeRobot如何讓機器人真正“懂你”

機器人之言&#xff1a;早在2024年&#xff0c;Hugging Face正式進軍真實世界機器人應用領域&#xff0c;推出了開源機器人項目LeRobot。LeRobot不僅僅是一個模型庫&#xff0c;它是一個完整的機器人學習平臺&#xff0c;融合了模仿學習、強化學習、數據可視化以及仿真環境。其…

搭建個人博客系列--MySql

前期提要&#xff1a;搭建個人博客系列--docker-CSDN博客 目前已經擁有了docker所以只需要將MySql安裝在docker上即可。 一、在docker安裝mysql docker pull mysql 二、查詢docker內的mysql鏡像 三、啟動msql docker run -d -p 33060:3306 -v /home/mysql/conf:/mysql/conf.d…

【Spring】Spring Boot + OAuth2 + JWT + Gateway的完整落地方案,包含認證流程設計

Spring Boot OAuth2 JWT Gateway的完整落地方案&#xff0c;包含認證流程設計網關在服務中的使用一、整體架構設計二、核心組件實現1. OAuth2認證服務器&#xff08;auth-service&#xff09;2. JWT自定義增強&#xff08;存儲用戶信息&#xff09;三、Gateway全局攔截&…

第一個小程序

一、前言隨著移動互聯網的發展&#xff0c;用戶對“即用即走”的輕量級應用需求日益增長&#xff0c;而傳統 App 在下載安裝、更新維護等方面存在一定的門檻。小程序應運而生&#xff0c;它是一種無需下載即可使用的應用程序形態。本文將帶你完成人生中第一個微信小程序的開發全…

【辦公類-54-07】20250901 2025學年第一學期班級點名冊模版(雙休國定假涂成灰色、修改標題和頁眉,批量導出PDF)

背景需求: 制作了校歷單后,第二個要制作的就是點名冊(灰色版) 【辦公類-54-03】20240828班級點名冊模版(雙休國定假涂成灰色)2024學年第一學期_姓名周一到周五的點名冊怎么畫-CSDN博客文章瀏覽閱讀2.1k次,點贊24次,收藏4次。【辦公類-54-03】20240828班級點名冊模版(…

iOS App首次啟動請求異常調試:一次冷啟動鏈路抓包與初始化流程修復

在一次 iOS App 大版本更新后&#xff0c;部分用戶反饋首次打開 App 時會出現“無法連接服務器”的提示&#xff0c;需要重啟 App 才能正常使用。而后續使用過程中接口調用都正常。服務器端并未記錄請求到達&#xff0c;日志中只有 sporadic&#xff08;零星&#xff09;斷連記…

【Linux網絡篇】:網絡中的其他重要協議或技術——DNS,ICMP協議,NAT技術等

?感謝您閱讀本篇文章&#xff0c;文章內容是個人學習筆記的整理&#xff0c;如果哪里有誤的話還請您指正噢? ? 個人主頁&#xff1a;余輝zmh–CSDN博客 ? 文章所屬專欄&#xff1a;Linux篇–CSDN博客 文章目錄其他重要協議或技術1.DNS2.ICMP協議3.NAT技術4.代理服務器其他重…

HarmonyOS學習4 --- 創建一個頁面

1、聲明式UI語法Entry Component struct My_page {State isLogin: boolean falsebuild() {Row() {Image(this.isLogin ? $r(app.media.icon_leon) : $r(app.media.icon)).height(60).width(60).onClick(() > {this.isLogin !this.isLogin})Text(this.isLogin ? $r(app.s…

【Java EE】Spring MVC 的使用

1. 路由映射&#xff1a;RequestMapping&#xff1a;當用戶訪問某個 URL 時&#xff0c;該注解會根據 URL 的路徑映射到具體的程序中對應的類或方法&#xff08;路由映射&#xff09;。修飾方法時&#xff0c;路徑為類路徑 方法路徑。默認情況下同時支持 GET 和 POST&#xff…

pip 安裝默認切換到國內鏡像(清華園,阿里云等)

國內Python包鏡像地址如下&#xff1a; 清華&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/阿里云&#xff1a;https://mirrors.aliyun.com/pypi/simple/中國科技大學&#xff1a;https://pypi.mirrors.ustc.edu.cn/simple/華為云&#xff1a;https://repo.huaweiclou…

AI agent 學習

參考&#xff1a; AI搜索DeepResearch&#xff1f;_大模型 deepsearch 深度搜索-CSDN博客 Agent是以大語言模型為大腦驅動的系統&#xff0c;具備自主理解、感知、規劃、記憶和使用工具的能力&#xff0c;能夠自動化執行和完成復雜任務。 自主性和自適應&#xff0c;是判斷一款…

【PTA數據結構 | C語言版】求單鏈表list中的元素個數,即表長

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;將 n 個整數順次插入一個初始為空的單鏈表的表頭。最后輸出單鏈表的表長。 本題旨在訓練學習者熟悉單鏈表的基本操作&#xff0c;不建議直接輸出 n。 輸入格式&#xff1a;…

玩轉Docker | 使用Docker部署HomeBox家庭庫存管理工具

玩轉Docker | 使用Docker部署HomeBox家庭庫存管理工具 前言一、HomeBox介紹Homebox簡介主要特點主要使用場景二、系統要求環境要求環境檢查Docker版本檢查檢查操作系統版本三、部署HomeBox服務下載HomeBox鏡像編輯部署文件創建容器檢查容器狀態檢查服務端口安全設置四、訪問Hom…

QT中的常用控件-QWidget的enable屬性

QT中的常用控件-QWidget的enable屬性 enable描述了一個控件是否處于“可用”狀態 與之相對應的概念是“禁用”&#xff0c;禁用是該控件不能接受任何用戶的輸入事件&#xff0c;并且外觀上往往是灰色的 如果一個Widget被禁用&#xff0c;則該Widget的子元素也被禁用API說明IsEn…

【數據結構】復雜度分析

目錄 一、算法 1.基本概念 2.描述方法 3.算法效率 二、算法的時間復雜度 三、算法的空間復雜度 一、算法 1.基本概念 通俗的講&#xff0c;算法是解決問題的方法&#xff0c;比如在現實生活中一道菜譜&#xff0c;一個安裝輪椅的操作指南等。 嚴格的說&#xff0c;算法…

推薦系統基礎 --ShusenWang

學習b站up主的ShusenWang的推薦系統筆記 指標 任何系統/算法/模型都需要評估&#xff0c;對于推薦系統的指標有消費指標和北極星指標&#xff0c;消費指標是衡量用戶對產品的使用情況&#xff0c;使用頻率廣度和深度&#xff0c;用于了解用戶的使用習慣&#xff0c;北極星指標是…

linux wsl2 docker 鏡像復用快速方法

GitHub項目中的devcontainer.json、Dockerfile構建了一個A項目的鏡像環境&#xff0c;現在我有一個文件夾&#xff0c;文件夾中只有一個b.py文件&#xff0c;此時我希望使用A項目的環境&#xff0c;如何實現&#xff1f;注意&#xff1a; 建議使用下面的方法2 解決方案&#xf…

(生活比喻-圖文并茂)http2.0和http3.0的隊頭阻塞,http2.0應用層解決,TCP層存在,3.0就是徹底解決,到底怎么理解區別???

說明一下&#xff1a; http屬于應用層協議&#xff0c;TCP和udp屬于傳輸層協議 文章目錄階段一&#xff1a;HTTP/1.1 的情況&#xff08;單車道收費站&#xff0c;一次過一輛&#xff09;階段二&#xff1a;HTTP/2 的情況&#xff08;多車道收費站&#xff0c;但出口只有一條路…

ARM環境openEuler2203sp4上部署19c單機問題-持續更新

問題01、報錯如下orcl:/home/oracledb15> export CV_ASSUME_DISTIDRHEL8 orcl:/home/oracledb15> $ORACLE_HOME/runInstaller -applyPSU /soft/37642901 Exception in thread "main" java.lang.UnsatisfiedLinkError: /u01/app/oracle/product/19.0.0/db_1/oui…

php成績分析系統單科分數分布分析202507

提交二維數據表&#xff0c;識別成績科目顯示科目選擇&#xff0c;選擇科目后顯示樣本數,平均分,最高分,最低分,中位數,柱狀圖圖表顯示各分值人數分布&#xff0c;表格顯示統計數據。 技術&#xff1a;html5css3ajaxphp 原生代碼實現。 效果圖&#xff1a; 下載&#xff1a; …