用table展示树形结构数据_复习一下数据结构(二)——2.2 树形索引(23树)
????????普通樹一個結點可以有多個孩子,但它本身只能存儲一個元素,而二叉樹結點最多只能有兩個,這對于元素非常多的時候,會使得樹的度或者是高度會非常大。這就使得內存存取外存的次數會增多,一旦涉及到外部存儲設備,時間復雜度的計算就會受到影響,所以為了降低對外存設備的訪問次數,就引入了一個叫多路查找樹(mutil-way search tree)的數據結構。
????????多路查找樹,其每一個結點的孩子數可以多于兩個,且每一個結點可以存儲多個元素。多路查找樹有查找的性質,所以,所有元素之間又存在著特定的排序關系。多路查找樹的4種特殊形式:2-3樹、2-3-4樹、B樹和B+樹
? ? ? ? 最開始說說最簡單的B樹,2-3樹
????????1.1 概念
????????2-3樹其中的每個非葉子結點都具有兩個孩子(2結點)或三個孩子(3結點)。高度為h的2-3樹結點數至少有2^h - 1個。
????????2結點包含一個元素S和兩個孩子(或沒有孩子)。元素S大于左子樹包含的元素,小于右子樹包含的元素。
????????3結點包含兩個元素S和L以及三個孩子(或沒有孩子)。元素S大于左子樹包含的元素且小于中間子樹包含的元素,元素L大于中間子樹包含的元素小于右子樹包含的元素。
????????且所有葉子結點都在同一層次。
????????1.2 操作2-3樹
????????1.2.1 查找元素
????????2-3樹的查找方式與二叉樹類似,根據元素與結點的大小比對決定后續路線。如上圖,我需要找個10,首先2結點10 > 8,往右子樹找;下一結點包含兩個元素,為3結點,10 < 12,往左子樹找;左子樹中比較查找得到10。
????????1.2.2 插入
????????2-3樹的插入操作與二叉樹相同,插入操作一定是發生在葉子節點上。
????????1)對于一個空樹來說,插入一個2結點即可
??????? 2)插入結點到一個2結點的葉子上,由于其本身就一個元素,所以只需要將其變成3結點即可。
????????如上圖,我希望插入一個元素3,根據遍歷,3 < 8,3 < 4,于是考慮插入到葉子結點1所在位置,3 > 1,于是3在1的右邊兒。
??????? 3)往3結點插入一個新元素,就需要將其拆分,且將樹中兩元素或插入元素的三者中選擇其一向上移動一層。
????????來看看第一種情況,插入的元素是5,被插入的結點是(6,7),是一個3結點,當父節點是2節點,這時候考慮將567其中一人升一級,4 < 5 < 6, 5 < 6 < 7,將6提上一層,讓父節點變為3節點,5插入變成中間子樹,剩下一個7為右子樹
????????另一種情況,插入的元素是11,11 < 12,顯然,11應該插入到3節點(9,10)中,但(9,10)節點不能再插入元素了,于是考慮將11插入到(12,14)節點中,這時候8 < 11 < 12,所以,將12向上提一層,這時候,原來的擁有8元素的2結點變為了3結點,剩下的11,9,10需要考慮將他們變為中子樹
????????1.2.3 刪除
??????? 1)所刪除的元素位于3結點的葉子結點上直接刪除即可。因為3結點中肯定是包含兩個元素的,直接刪除也不會影響到2-3樹的結構變化。如圖,我想要把元素9刪除,那么我直接剔除元素9即可
??????? 2)刪除的元素位于2結點上,即刪除的是只有一個元素的結點,相當于對結點進行刪除操作。這個時候如果直接把結點刪除,便會不符合2-3樹的定義(無子結點或必須擁有N個子節點)。如,我想要刪除元素1,結點4本來是擁有子結點1與子結點6,7的,此時少了結點1,便不符合2-3樹的定義了。
????????于是,對于刪除的元素處于2結點的位置時候,需要分四種情況考慮:
????????第一種,結點雙親也是2結點,且擁有一個3結點的孩子,正如上圖,那么這時候只需要左旋,將6元素提上一層即可
????????第二種,結點的雙親是2結點,右孩子也是2結點。這個時候就不能像上一種情況那樣直接左旋,這樣會造成新的樹形沒有右孩子,因此需要對整棵樹進行變形,來讓擁有7元素的這個結點變為3結點。比如,我刪除了一個元素4的結點。這個時候需要讓8加入到元素7的結點中,然后讓右子樹最小的一位元素9到頂層最后左旋即可。
????????情形三,此節點的雙親是一個3結點。比如說我刪除一個元素10,這個時候只需要將3結點的小元素降下來,然后與中子樹的合為一個3結點即可。
????????情形四,當前的2-3樹為一個滿二叉樹,這個時候,刪除任何一個葉子都需要讓整棵樹變形。我從下圖中刪除一個8元素的結點,這個時候9肯定不能單獨作為一個2結點存在了,考慮到2-3樹的性質,6與7合為一個3結點,放左子樹,14提上一層,13當做一個中子樹,15作為一個右子樹
總結
以上是生活随笔為你收集整理的用table展示树形结构数据_复习一下数据结构(二)——2.2 树形索引(23树)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SWAT模型在水文水资源、面源污染模拟中
- 下一篇: HMM隐马尔科夫模型及MATLAB实现