二叉搜索樹大冒險:尋找-插入-刪除

OK,看我們題目就可知道啦,今天要分享學習的一種數據結構就是二叉搜索樹。

內容題目也說了三個大概的,分別是尋找、插入、刪除。

講這個之前呢,那么就先講講這個二叉搜索樹是何方神圣呢?

二叉搜索樹:

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

若它的左子樹不為空,則左子樹上的所有節點的值都小于根節點的值。

若它的右子樹不為空,則右子樹上的所有節點的值都大于根節點的值。

它的左右子樹也分別為二叉搜索樹

示例如下:

OK,講完了這個概念,那么接下來這個操作內容吧。

首先創建這個節點先

public class SearchTree {class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int val){this.val=val;}}public TreeNode root=null;
}

以及把這個節點初始一個變量root,置為null。

接下來,就寫這個簡單的方法——查找

查找

public TreeNode search(int key){TreeNode cur=root;while(cur!=null){if(cur.val<key){cur = cur.right;}else if(cur.val>key){cur=cur.left;}else{return cur;}}return null;}

思路:

讓一個cur的節點幫我去走,因為root的左邊比root小,右邊比root大,所以當cur.val小于key時,說明key大往右走,否則往左走,都不是,即找到了,就可以返回當前節點的值了。

插入

先上代碼

public void insert(int val){TreeNode node=new TreeNode(val);if(root==null){root=node;return;}TreeNode cur=root;TreeNode parent=null;while(cur!=null){if(cur.val>val){parent=cur;cur=cur.left;}else if(cur.val<val){parent=cur;cur=cur.right;}else{return;}}if(parent.val>val){parent.left=node;}else{parent.right=node;}}

思路:

先定義好一個Node節點,保存要插入的信息,然后再定義一個parent節點來保存上一個節點的信息,為什么呢?

因為這個總體思路就是要插入的節點的值比這個當前root節點的值進行比大小,大于root就往右走,小于往左走。

接著,再定義一個cur的節點,讓它去走,當cur往左還是往右走時,parent都要走到當前cur的位置

當然,插入一個已有的值,可以選擇return了,

當while循環走完,意味著走到了對的位置了

舉個例子

插入一個2,那么這個cur就得往左走,走到1位置才是正確的,

然后parent也是到了cur的位置。

然后,當前的parent的值和當前val的值相比,大于就插入右邊,小于就插入左邊,

顯然這個例子中,2插入1的右邊。

最后一個內容。

刪除

這里的刪除有些麻煩,要分三種情況

第一種情況

刪除的節點左邊為空

舉個例子

這個當左邊為空時,也有三種狀況。

第一種:當root為刪除的節點時,讓root=cur.right

第二種:當cur為根節點的左邊時,圖中為3,既讓root=cur.right

第三種:當cur為根節點的右邊時,圖中為7,既讓root=cur.right

而根據這里我們也可以寫出第一部分的代碼了

public void remove(int key){TreeNode parent=null;TreeNode cur=root;while(cur!=null){if(cur.val<key){parent=cur;cur=cur.right;}else if(cur.val>key){parent=cur;cur=cur.left;}else{removeNode(parent,cur);}}}private void removeNode(TreeNode parent,TreeNode cur){if(cur.left==null){if(cur==root){root=cur.right;}else if(cur==parent.left){parent.left=cur.right;}else {parent.right=cur.right;}
}

代碼解釋:同樣的,我們刪掉節點之前,也先需要找到這個節點,刪除節點的事讓removeNode來做。

剛剛說明的root=cur.right中的root,當然是讓一個parent來記錄下來(即cur前面節點的信息)

第二種情況

即刪除的節點右邊為空

舉個例子

同樣的,這里也有三種情況

第一種:當刪除的節點為根節點,所以root=cur.left

第二種:當刪除的節點為root的左邊,圖中為3,所以root=cur.left

第三種:當刪除的節點為root的右邊,圖中為7,所以root=cur.left

所以到這里也可以寫一些代碼了

 private void removeNode(TreeNode parent,TreeNode cur){if(cur.left==null){if(cur==root){root=cur.right;}else if(cur==parent.left){parent.left=cur.right;}else {parent.right=cur.right;}}else if(cur.right==null){if(cur==root){root=cur.left;}else if(cur==parent.left){parent.left=cur.left;}else{parent.right=cur.left;}

這個代碼,跟第一種情況是類似的。

第三種情況

即刪除的節點左右都不為空

目錄

二叉搜索樹:

查找

插入

刪除

第一種情況

第二種情況

第三種情況

完!


舉個例子

當我們要刪除的節點為cur時,即圖中的60,我們采用的方法是替換法,

即其一的辦法是,在cur的右邊找到其最小值替換掉cur,即圖中的65替換掉60。

同理也可以找到cur的左邊的最大值替換掉cur,

這樣做是因為可以保持整棵樹為一個二叉搜索樹

具體這樣子做(以在cur的右子樹找最小值為例)

定義兩個節點,一個是target,一個是targetParent。

其中,target=cur.right

targetParent=cur

讓這個target去找到其最小值,找到了,再去賦值然后更新要修改的節點

修改完成后,再像其第一種情況中的當targetParent的左邊為空時,讓這個targetParent的左邊指向

target的右邊,相當于指向一個空指針,使其不再引用這個65的節點,達到刪除效果

上代碼

             TreeNode target=cur.right;TreeNode targetParent=cur;while(target !=null){targetParent=target;target =target.left;}cur.val=target.val;if(target ==targetParent.left){targetParent.left=target .right;}else{targetParent.right=target .right;}}

完!

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

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

相關文章

【學習筆記】無人機(UAV)在3GPP系統中的增強支持(五)-同時支持無人機和eMBB用戶數據傳輸的用例

引言 本文是3GPP TR 22.829 V17.1.0技術報告&#xff0c;專注于無人機&#xff08;UAV&#xff09;在3GPP系統中的增強支持。文章提出了多個無人機應用場景&#xff0c;分析了相應的能力要求&#xff0c;并建議了新的服務級別要求和關鍵性能指標&#xff08;KPIs&#xff09;。…

全網最詳細單細胞保姆級分析教程(二) --- 多樣本整合

上一節我們研究了如何對單樣本進行分析,這節我們就著重來研究一下如何對多樣本整合進行研究分析! 1. 導入相關包 library(Seurat) library(tidyverse) library(patchwork)2. 數據準備 # 導入單樣本文件 dir c(~/Desktop/diversity intergration/scRNA_26-0_filtered_featur…

Linux上如何安裝ffmpeg視頻處理軟件

在Linux上安裝ffmpeg需要以下步驟&#xff1a; 更新系統 在開始安裝之前&#xff0c;首先需要更新系統以獲取最新的軟件包列表和版本。在終端中執行以下命令&#xff1a; sudo apt update sudo apt upgrade安裝依賴庫 ffmpeg依賴于一些庫和工具&#xff0c;需要先安裝它們。在…

【香橙派 Orange pi AIpro】| 開發板深入使用體驗

目錄 一. &#x1f981; 寫在前面二. &#x1f981; 愉快的安裝流程2.1 安裝前準備2.2 流程準備2.2.1 燒錄鏡像2.2.2 開機2.2.3 連網2.2.4 SSH遠程連接開發板 2.3 體驗 AI 應用樣例 三. &#x1f981; 寫在最后 一. &#x1f981; 寫在前面 大家好&#xff0c;我是獅子呀&…

醫療級微型導軌:保障醫療行業手術安全!

微型直線導軌能成為一種專為醫療行業設備運用的高精度線性運動設備&#xff0c;在現代醫療領域&#xff0c;精準的位置控制和平穩的運動對于確保醫療設備的高效性能至關重要。那么&#xff0c;醫療行業對微型導軌有哪些要求呢&#xff1f; 1、精度&#xff1a;在手術過程中&…

C++客戶端Qt開發——開發環境

一、QT開發環境 1.安裝三個部分 ①C編譯器&#xff08;gcc&#xff0c;cl.exe……) ②QT SDK SDK-->軟件開發工具包 比如&#xff0c;windows版本QT SDK里已經內置了C的編譯器&#xff08;內置編譯器是mingw&#xff0c;windows版本的gcc/g&#xff09; ③QT的集成開發…

Python編程中用函數還是用復雜的表達式

要不要使用復雜表達式 Perl語言的原作者Larry Wall曾經說過&#xff0c;偉大的程序員都有三個優點&#xff1a;懶惰、暴躁和自負。乍一看這三個詞語沒有一個是褒義詞&#xff0c;但在程序員的世界里&#xff0c;這三個詞有不同的意義。首先&#xff0c;懶惰會促使程序員去寫一…

智慧園區規劃建設解決方案PPT(40頁)

智慧園區規劃建設解決方案摘要 1. 園區定義與發展歷程 園區&#xff0c;亦稱開發區&#xff0c;是在特定產業和區域政策指導下形成的區域。它們通過提供基礎設施和生產空間&#xff0c;吸引投資&#xff0c;形成技術、資本密集區&#xff0c;推動經濟發展。園區發展經歷了四代…

Docker 部署 ShardingSphere-Proxy 數據庫中間件

文章目錄 Github官網文檔ShardingSphere-Proxymysql-connector-java 驅動下載conf 配置global.yamldatabase-sharding.yamldatabase-readwrite-splitting.yamldockerdocker-compose.yml Apache ShardingSphere 是一款分布式的數據庫生態系統&#xff0c; 可以將任意數據庫轉換為…

【qt】TCP客戶端信息的接受和發送

當有信息時的槽函數關聯 跟服務端收到信息一樣,當可以讀一行的時候,就從套接字讀一行. 發送信息也是和服務端如出一轍,通過write(). 運行結果:

java EnumSet 介紹

EnumSet 是 Java Collections Framework 中專門為枚舉類型設計的高效集合實現。與其他集合類相比,EnumSet 提供了許多優點,如高效性、類型安全和易用性。它只能包含單個枚舉類型的值,并且在內部使用位向量實現,因而在空間和時間上都非常高效。 EnumSet 的特點 高效性:Enu…

Spring MVC 中的文件上傳 和 文件下載

Spring MVC 中的文件上傳 和 文件下載 文章目錄 Spring MVC 中的文件上傳 和 文件下載1. Spring MVC 中的文件上傳2. Spring MVC 中的文件下載3. 總結&#xff1a;4. 最后&#xff1a; 1. Spring MVC 中的文件上傳 文件上傳是&#xff1a;瀏覽器端向服務器發送文件&#xff0c…

C 語言結構體

由于近期項目需求,需使用到大量的指針與結構體&#xff0c;為更好的完成項目&#xff0c;故對結構體與指針的內容進行回顧&#xff0c;同時撰寫本博客&#xff0c;方便后續查閱。 本博客涉及的結構體知識有&#xff1a; 1.0&#xff1a;結構體的創建和使用 2.0: typedef 關…

解鎖音樂密碼,人工智能創作動人歌詞

在音樂的神秘世界里&#xff0c;每一段旋律都像是一把等待開啟的密碼鎖&#xff0c;隱藏著無盡的情感與故事。而如今&#xff0c;人工智能正以其獨特的智慧和創造力&#xff0c;幫助我們解鎖這些音樂密碼&#xff0c;創作出動人的歌詞。 “妙筆生詞智能寫歌詞軟件&#xff08;…

Provider(1)- 什么是AudioBufferProvider

什么是AudioBufferProvider&#xff1f; 顧名思義&#xff0c;Audio音頻數據緩沖提供&#xff0c;就是提供音頻數據的緩沖類&#xff0c;而且這個AudioBufferProvider派生出許多子類&#xff0c;每個子類有不同的用途&#xff0c;至關重要&#xff1b;那它在Android哪個地方使…

訪問 Postman OAuth 2.0 授權的最佳實踐

OAuth 2.0 代表了 web 安全協議的發展&#xff0c;便于在多個平臺上進行授權服務&#xff0c;同時避免暴露用戶憑據。它提供了一種安全的方式&#xff0c;讓用戶可以授權應用程序訪問服務。 在 Postman 中開始使用 OAuth 2.0 Postman 是一個流行的API客戶端&#xff0c;支持 …

亞馬遜店鋪注冊

**步驟一&#xff1a;準備注冊相關資料** 在注冊之前&#xff0c;請準備以下資料&#xff1a; 1.公司營業執照照片&#xff08;清晰完整的拍照上傳&#xff09; 2.法人身份證正反面照片&#xff08;清晰完整的拍照上傳&#xff09; 3.雙幣付款信用卡&#xff08;VISA&#xff0…

[PaddlePaddle飛槳] PaddleSpeech-自動語音識別-小模型部署

PaddleSpeech的GitHub項目地址 環境要求&#xff1a; gcc > 4.8.5 paddlepaddle < 2.5.1 python > 3.8 OS support: Linux(recommend), Windows, Mac OSXpip下載指令&#xff1a; python -m pip install paddlepaddle-gpu2.5.1 -i https://pypi.tuna.tsinghua.edu.c…

探索4D毫米波雷達和攝像頭在自動駕駛中的潛力

隨著自動駕駛技術的快速發展&#xff0c;關于各種傳感器的必要性&#xff0c;尤其是LiDAR&#xff08;激光雷達&#xff09;與毫米波雷達結合攝像頭的作用&#xff0c;激發了激烈的討論。在這篇博客中&#xff0c;我們將探討4D毫米波雷達和攝像頭的組合是否可能成為自動駕駛車輛…

將vue項目整合到springboot項目中并在阿里云上運行

第一步&#xff0c;使用springboot中的thymeleaf模板引擎 導入依賴 <!-- thymeleaf 模板 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency> 在r…