Java數據結構和算法(B樹)

前言

B樹又叫平衡的多路搜索樹;平衡的意思是又滿足平衡二叉樹的一些性質,左樹大于右樹;
多路意思是,可以多個結點,不再是像二叉樹只有兩個結點;

實現原理

B樹是一種自平衡的搜索樹,通常用于實現數據庫和文件系統中的索引。它通過保持節點的平衡結構來保證插入、刪除和查找操作在對數時間內完成。B樹的具體實現原理包括以下幾個方面:

1. 結構

  • 節點:每個節點包含多個鍵和指向子節點的指針。一個節點最多可以包含 m-1 個鍵和 m 個指針,其中 m 是B樹的階。
  • 根節點:根節點是樹的頂部節點,特殊情況下,根節點可以是一個葉子節點(當樹為空或只有一個節點時)。
  • 內部節點:非葉子節點,包含指向子節點的指針。
  • 葉子節點:沒有子節點的節點,包含數據記錄或指向數據記錄的指針。

2. 性質

  1. 鍵的順序:每個節點中的鍵按升序排列。
  2. 節點子樹:對于一個節點 N 和其中的鍵 K_i,所有在 K_i 左邊的子樹中的鍵都小于 K_i,所有在 K_i 右邊的子樹中的鍵都大于 K_i
  3. 平衡性:所有葉子節點位于同一層次,這保證了樹的平衡。
  4. 節點容量:除了根節點外,每個節點至少包含 ?m/2? - 1 個鍵,最多包含 m-1 個鍵。

3. 操作

查找

從根節點開始,逐層向下查找:

  1. 在當前節點中找到第一個大于或等于目標鍵的位置 i
  2. 如果 K_i 正好等于目標鍵,則查找成功。
  3. 如果目標鍵小于 K_i 或在所有鍵后,遞歸地在對應的子樹中繼續查找。
插入
  1. 找到插入位置:從根節點開始,找到插入鍵的位置。
  2. 分裂節點:如果插入鍵導致某個節點的鍵超過 m-1,則將該節點分裂為兩個節點,并將中間鍵提升到父節點。
  3. 遞歸分裂:如果提升的中間鍵導致父節點也超過 m-1 鍵,則繼續向上分裂,直到根節點。如果根節點也需要分裂,則樹的高度增加。
刪除
  1. 找到刪除位置:從根節點開始,找到要刪除的鍵。
  2. 葉子節點刪除:如果鍵在葉子節點,直接刪除。
  3. 內部節點刪除:如果鍵在內部節點,找到適當的替代鍵(前驅或后繼),并遞歸刪除替代鍵。
  4. 合并節點:如果刪除鍵導致某個節點的鍵少于 ?m/2? - 1,需要通過與兄弟節點合并或借用兄弟節點的鍵來維持B樹性質。

具體代碼實現

class AVLTreeNode {int key;int height;AVLTreeNode left;AVLTreeNode right;AVLTreeNode(int key) {this.key = key;this.height = 0;this.left = this.right = null;}
}public class AVLTree {private AVLTreeNode root;public AVLTree() {root = null;}// 獲取以節點為根的樹的高度private int height(AVLTreeNode node) {if (node == null) {return 0;}return node.height;}// 更新節點的高度private void updateHeight(AVLTreeNode node) {node.height = Math.max(height(node.left), height(node.right)) + 1;}// 左旋private AVLTreeNode rotateLeft(AVLTreeNode node) {AVLTreeNode rightNode = node.right;node.right = rightNode.left;rightNode.left = node;updateHeight(node);updateHeight(rightNode);return rightNode;}// 右旋private AVLTreeNode rotateRight(AVLTreeNode node) {AVLTreeNode leftNode = node.left;node.left = leftNode.right;leftNode.right = node;updateHeight(node);updateHeight(leftNode);return leftNode;}// 左右旋(先左后右)private AVLTreeNode rotateLR(AVLTreeNode node) {node.left = rotateLeft(node.left);return rotateRight(node);}// 右左旋(先右后左)private AVLTreeNode rotateRL(AVLTreeNode node) {node.right = rotateRight(node.right);return rotateLeft(node);}// 插入節點public void insert(int key) {root = insert(root, key);}// 遞歸插入并平衡private AVLTreeNode insert(AVLTreeNode node, int key) {if (node == null) {return new AVLTreeNode(key);}if (key < node.key) {node.left = insert(node.left, key);if (height(node.left) - height(node.right) == 2) {if (key < node.left.key) {node = rotateRight(node);} else {node = rotateLR(node);}}} else if (key > node.key) {node.right = insert(node.right, key);if (height(node.right) - height(node.left) == 2) {if (key > node.right.key) {node = rotateLeft(node);} else {node = rotateRL(node);}}}updateHeight(node);return node;}
}

QA:待定

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

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

相關文章

MySQL和MongoDB數據庫的區別

MySQL和MongoDB數據庫的區別 隨著大數據和云計算技術的興起&#xff0c;數據庫的選擇成為開發者和架構師必須面對的重要決策。MySQL和MongoDB作為關系型數據庫和非關系型數據庫的代表&#xff0c;在各自領域都有著廣泛的應用。本文將從多方面詳細比較MySQL和MongoDB&#xff0…

MATLAB:插值函數之interp與griddata

MATLAB 提供了多種插值函數來處理不同維度的數據。其中&#xff0c;interp1、interp2 和 griddata 是常用的插值函數&#xff0c;分別用于一維、二維和多維&#xff08;不規則&#xff09;數據的插值。 之前有對interp1進行過詳細介紹&#xff0c;如需詳細了解&#xff0c;請查…

會聲會影調速怎么用 會聲會影如何調整音頻速度

會聲會影是一款功能強大的視頻編輯軟件&#xff0c;可以幫助我們輕松的實現剪輯。 會聲會影的操作簡單易懂&#xff0c;界面簡潔明快。適合家庭使用&#xff0c; 我們使用會聲會影可以在家就能將視頻剪輯成好萊塢大片。但是在使用的過程中&#xff0c;仍然會遇到一些操作上的問…

洛谷 P3803 【模板】多項式乘法(FFT)

【模板】多項式乘法&#xff08;FFT&#xff09; 題目背景 這是一道多項式乘法模板題。 注意&#xff1a;本題并不屬于中國計算機學會劃定的提高組知識點考察范圍。 題目描述 給定一個 n n n 次多項式 F ( x ) F(x) F(x)&#xff0c;和一個 m m m 次多項式 G ( x ) G(…

C語言--指針數組和數組指針的區別

指針數組 就是一個數組&#xff0c;由指針構成的數組&#xff0c;每一個元素都是指針&#xff0c;每個指針可以指向不同的內存地址&#xff0c;這些地址可以是數組、變量。 int var1 10; int var2 20; int var3 30;int *ptrArray[3]; // 定義一個指針數組&#xff0c;包含…

2024年上半年軟件系統架構師論文【回憶版】

文章目錄 考試時間考試地點案例分析1、微服務架構的優點和缺點2、質量屬性的6個元素3、分布式鎖 Redis的缺點4、MongoDB 存儲矢量圖的優勢 論文回憶版論文一、論單元測試的設計與應用論文二、論大數據模型的設計與應用論文三、論模型驅動的架構設計及應用論文四、論云原生運維的…

Mybatis-Plus-Join

1. 簡介 官網 https://mybatisplusjoin.com/ 2. 基本用法 步驟&#xff1a; 添加依賴 <!--mybatis-plus-join--> <dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join-boot-starter</artifactId><ve…

探索LangGraph:如何創建一個既智能又可控的航空客服AI

這種設計既保持了用戶控制權&#xff0c;又確保了對話流程的順暢。但隨著工具數量的增加&#xff0c;單一的圖結構可能會變得過于復雜。我們將在下一節中解決這個問題。 第三部分的圖將類似于下面的示意圖&#xff1a; 狀態定義 首先&#xff0c;定義圖的狀態。我們的狀態和L…

homography原理和圖像相似度計算

1. homography 講homography原理 講homography應用 2. 圖像相似度計算 20230621-計算兩幅圖像的相似度 20221205-有史以來最全的圖像相似度算法 20231112-圖像相似度對比方法

C++:List的使用和模擬實現

???學習的道路很枯燥&#xff0c;希望我們能并肩走下來! 文章目錄 目錄 文章目錄 前言 一 list的介紹及使用 1.1 list的介紹 1.2 list的使用 1.2.1 list的構造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers …

golang+redis的延時隊列

網址 https://github.com/cfanbo/delay-queue-redis 代碼結構很簡單&#xff0c;簡單代表著自由度很高&#xff0c;使用過程中出現問題也很好修改。 我很喜歡這樣的代碼&#xff0c;至少我看的懂&#xff0c;該有的都有。 //package main // //import ( // "context&q…

leetcode209_長度最小的子數組

要求某個連續的區間內的元素值總和>S . 思路&#xff1a;滑動窗口&#xff1a;本質上是一種雙指針法。 &#xff08;1&#xff09;初始化left right 0&#xff1b; &#xff08;2&#xff09;left不動&#xff0c;right移動&#xff0c;擴大窗口&#xff0c;直至符合要…

selinux的安全策略可以影響ntp的方式

SELinux 是一個靈活而強大的模塊化安全策略框架&#xff0c;它允許管理員定義和執行非常具體的訪問控制策略。這些策略可以限制程序和進程對系統資源的訪問&#xff0c;包括文件、網絡端口、進程間通信等。 對于NTP&#xff0c;SELinux 策略可以影響以下幾個方面&#xff1a; …

網絡空間安全數學基礎·整除與同余

主要內容&#xff1a; 整除的基本概念&#xff08;掌握&#xff09; 素數&#xff08;掌握&#xff09; 同余的概念&#xff08;掌握&#xff09; 1.1整除 定義&#xff1a;設a&#xff0c;b是任意兩個整數&#xff0c;其中b≠0&#xff0c;如果存在一個整數q&#xff0c;使 …

12306技術內幕

公司內部做的一次技術分享 文章目錄 12306的成就12306系統特點12306系統難點解決思路產品角度技術角度余票庫存的表如何設計&#xff1f; 搶票軟件推薦巨人的肩膀 對于未公開的技術部分&#xff0c;只能結合已公開的信息&#xff0c;去做大膽的猜想。 本文提到的一些解決方案&…

SpringBoot + Mybatis-Plus中樂觀鎖實現

悲觀鎖 悲觀鎖是一種悲觀思想&#xff0c;它認為數據很可能會被別人所修改 所以總會對數據進行上鎖&#xff0c;讀操作和寫操作都會上鎖&#xff0c;性能較低&#xff0c;使用較少&#xff01; 樂觀鎖 樂觀鎖是一種樂觀思想&#xff0c;它認為數據并不一定會被別人所修改 所以…

成為程序員后我都明白了什么?從入行到棄坑?

作為一個入行近10年的php程序員&#xff0c;真心感覺一切都才剛開始&#xff0c;對計算機&#xff0c;編程語言的理解也好&#xff0c;程序員中年危機也罷&#xff0c;之前都是聽別人說的&#xff0c;真的自己到了這個水平&#xff0c;這個年齡才深刻體會到這其中的種種。 我一…

測試基礎05:軟件測試的分類

課程大綱 1、兩種架構&#xff08;Architecture&#xff09; 1.1、B/S&#xff08;Browser/Server&#xff09; 瀏覽器服務器架構&#xff08;大體3步&#xff09;&#xff1a;用戶通過瀏覽器向服務器發出請求&#xff0c;服務器處理請求&#xff0c;將結果通過網絡返回到用戶…

使用Webcam實現攝像頭的開啟和關閉,并保存和復制圖片

實現思路 0&#xff0c;將webcam的jar文件傳入項目中 1&#xff0c;顯示攝像頭的地方&#xff1a;創建一個畫板&#xff0c;在畫板上添加開啟和關閉按鈕 2&#xff0c;設置開啟和關閉功能&#xff1a;創建一個類實現動作監聽器&#xff0c;進而實現監聽動作按鈕 3&#xff…