二叉搜索樹java實現

顧名思義,二叉搜索樹是一棵二叉樹,每個節點就是一個對象,這個對象包含屬性left、right和parent。left指向節點的左孩子,right指向節點的右孩子,parent指向節點的父節點(雙親)。如果某個孩子節點和父節點不存在,則相應的屬性為null。根節點是樹中唯一父節點指針為null的節點。

二叉搜索樹中的關鍵字滿足以下性質:

假設x是二叉搜索樹中的一個節點,如果y是x的左子樹中的一個節點,那么y.key ≤ x.key;如果y是x右子樹中的一個節點,那么y.key ≥ x.key。

兩棵二叉搜索樹的示意圖如下:
在這里插入圖片描述
二叉搜索樹支持查詢、求最大值、最小值以及追加和刪除等操作,其基于java的簡單實現如下:

/*** 數據結構-二叉搜索樹*/
public class BinarySearchTree {/*** 樹的根節點*/private Node root;/*** 根據關鍵字搜索節點** @param key 關鍵字* @return key所在的節點*/public Node search(int key) {Node node = root;while (node != null && key != node.key) {// 如果key小于當前節點的key,則往左孩子節點找,否則往右孩子節點找if (key < node.key) {node = node.left;} else {node = node.right;}}return node;}/*** 獲取key最小的節點** @return key最小的節點*/public Node min() {return min(root);}/*** 獲取以node為根的子樹中key最小的節點** @param node 子樹根節點* @return 子樹中key最小的節點*/public Node min(Node node) {while (node.left != null) {node = node.left;}return node;}/*** 獲取key最大的節點** @return key最大的節點*/public Node max() {return max(root);}/*** 獲取以node為根的子樹中key最大的節點** @param node 子樹根節點* @return 子樹中key最大的節點*/public Node max(Node node) {while (node.right != null) {node = node.right;}return node;}/*** 向樹中添加節點** @param key 插入節點的key*/public void add(int key) {Node node = root;Node temp = null;// 尋找合適的節點添加新節點while (node != null) {temp = node;if (key < node.key) {node = node.left;} else {node = node.right;}}Node newNode = new Node();newNode.parent = temp;newNode.key = key;if (temp == null) { // 該樹上還沒有節點root = newNode;} else if (key < temp.key) {temp.left = newNode;} else {temp.right = newNode;}}/*** 刪除以key為關鍵字的節點** @param key 關鍵字*/public void delete(int key) {Node node = search(key);if (node.left == null) {transplant(node, node.right);} else if (node.right == null) {transplant(node, node.left);} else {Node min = min(node.right);if (!min.parent.equals(node)) {transplant(min, min.right);min.right = node.right;min.right.parent = min;} transplant(node, min);min.left = node.left;min.left.parent = min;}}/*** 用node2為跟的子樹替換node1為根的子樹** @param node1 子樹1* @param node2 子樹2*/private void transplant(Node node1, Node node2) {// node1是根節點if (node1.parent == null) {root = node2;} else if (node1 == node1.parent.left) { // 如果node1是左孩子node1.parent.left = node2;} else { // 如果node1是右孩子node1.parent.right = node2;}if (node2 != null) {node2.parent = node1.parent;}}public Node getRoot() {return root;}/*** 樹上的節點*/public static class Node {/*** 節點關鍵字*/private int key;/*** 節點的左孩子*/private Node left;/*** 節點的右孩子*/private Node right;/*** 節點的父節點*/private Node parent;public int getKey() {return key;}public Node getLeft() {return left;}public Node getRight() {return right;}public Node getParent() {return parent;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Node node = (Node) o;return key == node.key && Objects.equals(left, node.left)&& Objects.equals(right, node.right) && Objects.equals(parent, node.parent);}@Overridepublic int hashCode() {return Objects.hash(key, left, right, parent);}}
}

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

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

相關文章

scala的類介紹

scala的類、抽象類、接口、對象 class :類&#xff0c; 通過new關鍵字來實例化&#xff0c;每次實例化都會創建一個新的對象&#xff1b;用來定義普通的類。object&#xff1a;對象&#xff0c;用來定義一個單例對象的&#xff0c;它只有一個實例&#xff0c;且在程序運行期間…

黑馬點評筆記 redis實現緩存

文章目錄 什么是緩存?為什么要使用緩存 如何使用緩存功能實現緩存模型和思路代碼實現 緩存更新策略數據庫緩存不一致解決方案代碼實現 什么是緩存? 緩存(Cache),就是數據交換的緩沖區,俗稱的緩存就是緩沖區內的數據,一般從數據庫中獲取,存儲于本地代碼(例如: 例1:Static fi…

vr小鼠虛擬解剖實驗教學平臺減少了受感染風險

家畜解剖實驗教學是培養畜牧獸醫專業學生實際操作能力的專業教學活動中的核心手段。采取新型教學方式與手段&#xff0c;合理設置實驗教學內容&#xff0c;有助于激發學生的操作積極性&#xff0c;促進實踐教學的改革。 家畜解剖VR仿真教學是一種借助VR虛擬現實制作和web3d開發…

常用通信接口、協議:SCCB

一、概述 SCCB(串行攝像頭控制總線)是由歐姆尼圖像技術公司&#xff08;OmniVision&#xff09;開發的一種類IIC的總線&#xff0c;主要用于其OV系列的圖像傳感器上&#xff08;但目前有很多家的圖像傳感器都有采用該控制總線&#xff09;。相對于IIC總線來說SCCB與之最主要的差…

java基礎-集合

1、集合 在java中&#xff0c;集合&#xff08;Collection&#xff09;指的是一組數據容器&#xff0c;它可以存儲多個對象&#xff0c;并且允許用戶通過一些方法來訪問與操作這些對象。j 集合的實現原理都基于數據結構和算法&#xff0c;如下&#xff1a; 數據結構&#xff1…

振南技術干貨集:制冷設備大型IoT監測項目研發紀實(2)

注解目錄 1.制冷設備的監測迫在眉睫 1.1 冷食的利潤貢獻 1.2 冷設監測系統的困難 &#xff08;制冷設備對于便利店為何如何重要&#xff1f;了解一下你所不知道的便利店和新零售行業。關于電力線載波通信的論戰。&#xff09; 2、電路設計 2.1 防護電路 2.1.1 強電防護 …

基于JavaWeb+SSM+Vue教學輔助微信小程序系統的設計和實現

基于JavaWebSSMVue教學輔助微信小程序系統的設計和實現 源碼獲取入口前言主要技術系統設計功能截圖Lun文目錄訂閱經典源碼專欄Java項目精品實戰案例《500套》 源碼獲取 源碼獲取入口 前言 1.1 概述 隨著信息時代的快速發展&#xff0c;互聯網的優勢和普及&#xff0c;人們生活…

[項目管理-33/創業之路-87/管理者與領導者-127]:如何提升自己項目管理的能力和水平

目錄 前言&#xff1a; 一、項目經理的角色定位 1.1 項目經理的職責 1.2 不同矩陣類型的項目&#xff0c;項目經理的職責 1.3 項目經理的角色定位 1.4 項目經理的發展路徑 二、項目經理項目理論和知識結構 三、軟件項目經理在計算機水平的提升 四、項目經理業務知識的…

nodejs微信小程序+python+PHP-儲能電站運營管理系統的設計與實現-計算機畢業設計推薦

目 錄 摘 要 I ABSTRACT II 目 錄 II 第1章 緒論 1 1.1背景及意義 1 1.2 國內外研究概況 1 1.3 研究的內容 1 第2章 相關技術 3 2.1 nodejs簡介 4 2.2 express框架介紹 6 2.4 MySQL數據庫 4 第3章 系統分析 5 3.1 需求分析 5 3.2 系統可行性分析 5 3.2.1技術可行性&#xff1a;…

七、通過libfdk_aac編解碼器實現aac音頻和pcm的編解碼

前言 測試環境&#xff1a; ffmpeg的4.3.2自行編譯版本windows環境qt5.12 AAC編碼是MP3格式的后繼產品&#xff0c;通常在相同的比特率下可以獲得比MP3更高的聲音質量&#xff0c;是iPhone、iPod、iPad、iTunes的標準音頻格式。 AAC相較于MP3的改進包含&#xff1a; 更多的采…

【leetcode】209. 長度最小的子數組

209. 長度最小的子數組 - 力扣&#xff08;LeetCode&#xff09; 給定一個含有 n 個正整數的數組和一個正整數 target 。 找出該數組中滿足其總和大于等于 target 的長度最小的 連續子數組 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其長度。如果不存在符合條…

系列八、key是弱引用,gc垃圾回收時會影響ThreadLocal正常工作嗎

一、key是弱引用&#xff0c;gc垃圾回收時會影響ThreadLocal正常工作嗎 到這里&#xff0c;有些小伙伴可能有疑問&#xff0c;ThreadLocalMap的key既然是 弱引用&#xff0c;那么GC時會不會貿然地把key回收掉&#xff0c;進而影響ThreadLocal的正常使用呢&#xff1f;答案是不會…

HTML新手入門筆記整理:HTML基本標簽

結構標簽 <html> </html> 告訴瀏覽器這個頁面是從<html> 開始&#xff0c;到 </html>結束 <head> </head> 網頁的頭部&#xff0c;用于定義一些特殊內容&#xff0c;如頁面標題、定時刷新、外部文件等。 <body> </body> …

基于SSM的旅游管理系統設計與實現

末尾獲取源碼 開發語言&#xff1a;Java Java開發工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技術開發 數據庫&#xff1a;MySQL5.7和Navicat管理工具結合 服務器&#xff1a;Tomcat8.5 開發軟件&#xff1a;IDEA / Eclipse 是否Maven項目&#x…

大文件導出

關于大文件導出的優化迭代情況如下&#xff1a; 計算機配置&#xff1a;四核16G內存 初始版本為單線程單文件導出文件&#xff0c;mybatis讀 opencsv寫&#xff0c;耗時將近三小時&#xff1b; 第一輪優化改為多線程單文件&#xff0c;提高讀數據效率&#xff0c;時間僅縮減十分…

數據分析基礎之《matplotlib(1)—介紹》

一、什么是matplotlib 1、專門用于開發2D圖表&#xff08;包括3D圖表&#xff09; 2、使用起來及其簡單 3、以漸進、交互方式實現數據可視化 4、matplotlib mat&#xff1a;matrix&#xff08;矩陣&#xff09; plot&#xff1a;畫圖 lib&#xff1a;庫 二、為什么要學習m…

記錄一次因內存不足而導致hiveserver2和namenode進程宕機的排查

背景 最近發現集群主節點總有進程宕機&#xff0c;定位了大半天才找到原因&#xff0c;分享一下 排查過程 查詢hiveserver2和namenode日志&#xff0c;都是正常的&#xff0c;突然日志就不記錄了&#xff0c;直到我重啟之后又恢復工作了。 排查各種日志都是正常的&#xff0…

vue3 + vue-router + keep-alive緩存頁面

1.vue-router中增加mate.keepAlive和deepth屬性 {path: /,name: home,component: HomeView,meta: {// 當前頁面要不要緩存keepAlive: false,// 當前頁面層級deepth: 1,}},{path: /list,name: list,component: ListView,meta: {// 當前頁面要不要緩存keepAlive: true,// 當前頁…

代碼規范之-理解ESLint、Prettier、EditorConfig

前言 團隊多人協同開發項目&#xff0c;困擾團隊管理的一個很大的問題就是&#xff1a;無可避免地會出現每個開發者編碼習慣不同、代碼風格迥異&#xff0c;為了代碼高可用、可維護性&#xff0c;需要從項目管理上盡量統一和規范代碼。理想的方式需要在項目工程化方面&#xff…

Kafka官方生產者和消費者腳本簡單使用

問題 怎樣使用Kafka官方生產者和消費者腳本進行消費生產和消費?這里假設已經下載了kafka官方文件,并已經解壓. 生產者配置文件 producer_hr.properties bootstrap.servers10.xx.xx.xxx:9092,10.xx.xx.xxx:9092,10.xx.xx.xxx:9092 compression.typenone security.protocolS…