C/C++ 中的 2-3 樹(搜尋和插入)?


2-3 樹定義為一種樹形資料結構,其中每個具有子節點的內部節點要麼有兩個子節點(2-節點)和一個數據元素,要麼有三個子節點(3-節點)和兩個資料元素。

定義

如果一個內部節點具有一個數據元素和兩個子節點,則稱其為 2-節點。

如果一個內部節點具有兩個資料元素和三個子節點,則稱其為 3-節點。

當且僅當以下語句之一滿足時,我們稱 T 為 2-3 樹:

  • T 為空。換句話說,T 不包含任何節點。

  • T 是一個具有資料元素 a 的 2-節點。如果 T 具有左子節點 L 和右子節點 R,則我們得出結論:

  • L 和 R 被視為相同高度的非空 2-3 樹;

  • a 大於 L 中的每個元素;並且

  • a 小於或等於 R 中的每個資料元素。

  • T 是一個具有資料元素 a 和 b 的 3-節點,其中 a 小於 b。如果 T 具有左子節點 L、中間子節點 M 和右子節點 R,則我們得出結論:

  • L、M 和 R 被視為相同高度的非空 2-3 樹;

  • a 大於 L 中的每個資料元素且小於或等於 M 中的每個資料元素;並且

  • b 大於 M 中的每個資料元素且小於或等於 R 中的每個資料元素。

屬性

  • 每個內部節點都被視為 2-節點或 3-節點。

  • 所有葉子節點都位於同一層。

  • 所有資料都保持排序。

操作

搜尋

在 2-3 樹中搜索專案與在二叉搜尋樹中搜索專案相同。由於每個節點中的資料元素都是有序的,因此搜尋函式將被引導到正確的子樹,最終到達包含該專案的正確節點。

  • 設 T 為 2-3 樹,d 為我們要查詢的資料元素。如果 T 為空,則 d 不在 T 中,我們完成操作。

  • 設 r 為 T 的根節點。

  • 設 r 為葉子節點。如果 d 不在 r 中,則 d 不在 T 中。否則,d 在 T 中。特別是,d 可以在葉子節點中找到。我們不需要進一步步驟,操作完成。

  • 假設 r 是一個具有左子節點 L 和右子節點 R 的 2-節點。設 e 為 r 中的資料元素。

有三種情況:

  • 如果 d 等於 e,則我們在 T 中找到 d,操作完成。

  • 如果 d 小於 e,則將 T 設定為 L(根據定義,L 是一個 2-3 樹),並返回步驟 2。

  • 如果 d 大於 e,則將 T 設定為 R,並返回步驟 2。

  • 假設 r 是一個具有左子節點 L、中間子節點 M 和右子節點 R 的 3-節點。設 a 和 b 為 r 的兩個資料元素,其中 a

    • 如果 d 等於 a 或 b,則 d 在 T 中,操作完成。

    • 如果 d 小於 a,則將 T 設定為 L,並返回步驟 2。

    • 如果 a 小於 d 且 d 小於 b,則將 T 設定為 M,並返回步驟 2。

    • 如果 d 大於 b,則將 T 設定為 R,並返回步驟 2。

插入

插入透過搜尋鍵的正確位置並將其新增到該位置來執行。如果節點變成 4-節點,則該節點將被分成兩個 2-節點,中間鍵將被移動到父節點。然後父節點可能會變成 4-節點,在這種情況下,它也會被分割,並將鍵傳播到其父節點。此過程重複進行,直到我們到達不需要分割的 2-節點父節點,或者到達根節點,在這種情況下,我們將傳播的元素實現為建立一個新的 2-節點根節點。藉助此演算法,執行的運算元量與樹的高度成正比,因此由於樹是完全平衡的,所以是對數級的。此過程確保其結果為 2-3 樹:特別是,所有葉子節點都保持在相同的深度。

下圖解釋了此過程的可能情況。


在 2-3 樹中插入數字的 3 種可能情況。

更新於:2020年1月29日

668 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.