Java資料結構之234樹

2021-09-24 15:02:25 字數 3482 閱讀 6627

n叉樹簡介

每個節點只有乙個資料項,並且每個節點最多只有兩個子節點的樹稱為二叉樹。如果每個節點可以存多個(大於等於3)資料項,並且每個節點可以擁有多個(大於等於3)子節點的樹稱為n(大於等於3)叉樹。n叉樹相對於二叉樹而言,儲存相等數量的資料,n叉樹因為同一層存放的資料變多,相應樹的高度就變小,查詢也就更快。

234樹簡介

234樹的特點

234樹是n叉樹的一種,其中數字2、3、4可以認為是節點的子節點數量,234樹主要有以下特點:

乙個節點最多可以儲存3個資料項。

乙個節點(非葉節點)最多擁有4個子節點。

資料項個數與子節點數量關係為:子節點數量 = 資料項個數 + 1。

234樹中不存在空節點(沒有資料項的節點),這個可以從後面的**看出來。

資料存放規則

假如乙個節點中有三個資料項(從左往右為:d1,d2,d3),那麼其4個子節點(從左往右為:c1,c2,c3,c4),有如下大小關係:c1節點資料項及其子節點資料項 < d1 < c2節點資料項及其子節點資料項 < d2 < c3節點資料項及其子節點資料項 < d3 < c4節點資料項及其子節點資料項 。

插入資料

234樹插入資料,資料總是插入在葉子節點,跟二叉樹一樣會向下查詢合適的葉子節點,再次過程中核能會發生一系列節點變換(節點**),找到葉子節點後,然後根據節點資料項排列順序(左側資料項 < 中間資料項 < 右側資料項)將資料放入節點資料項中。

節點**

插入資料時,在向下尋找過程中如果遇到了資料項已經滿了的節點(擁有三個資料項),將會對改節點進行**,假如節點三個資料項從左往右為d1、d2、d3,四個子節點從左往右分別為c1、c2、c3、c4,**規則是:

將d2資料項上移,作為父節點的資料項(父節點最多只有兩個資料項),建立**節點的兄弟節點,將d1資料項作為兄弟節點的資料項,c1,c2作為兄弟節點的子節點,**完畢。

如果d2節點上移過程中,沒有父節點,即**節點為根節點,則新建根節點,然後d2作為根節點的資料項。

**實現

節點類

package com.lxx.tree;

/*** 234樹節點類

* 這裡為了簡便實現,節點類的資料項為integer資料

* @author lxx

*/public class node234

// 判斷當前節點是否已滿

public boolean isfull()

// 獲取父節點

public node234 getparent()

// 獲取指定位置的子節點

public node234 getchild(int childindex)

// 判斷節點是否為葉子節點

public boolean isleafnode()

// 獲取節點的資料項個數

public int getdataitemcount()

// 獲取指定位置的資料項

public int getdataitem(int dataitemindex)

// 連線子節點

public void connectchild(int childindex, node234 child)

}// 去掉子節點

public node234 removenode(int childindex)

// 查詢具體資料項在資料項陣列中的索引位置

public int finddataitemindex(integer dataitem) else if(dataitems[i].equals(dataitem))

}return -1;

}//插入資料項

public int insertitem(integer newdataitem)

if(newdataitem < dataitems[i]) else

}dataitems[0] = newdataitem;

return 0;

}//刪除大資料項

public integer removedataitem()

// 列印節點

public void displaynode()

}// 傳入資料項值比當前節點資料項都大,返回最右側子節點

return currentnode.getchild(dataitemcount - 1);

}// 判斷否資料項是否存在

public boolean i***ist(integer dataitem)

}// 插入乙個資料項

public void add(integer dataitem) else if (currentnode.isleafnode())

break;

else

currentnode = getnextchild(currentnode, dataitem);

}currentnode.insertitem(dataitem);

}// **節點

public void split(node234 currentnode) else

// 將要**節點的的中間資料項插入到父節點中 並且獲取到插入的索引

itemindex = parent.insertitem(item);

// 獲取父節點中資料項的個數

int dataitemcount = parent.getdataitemcount();

// 迴圈根據

for (int j = dataitemcount - 1; j > itemindex; j--)

parent.connectchild(itemindex + 1, brothernode); // 然後在原要拆分節點新的位置的右邊插入新的右邊節點

}// 列印一整棵樹

public void displaytree()

// 列印樹 傳入要從那個節開始打 從那層開始的 哪個節點開始的 前序遍歷

private void recdisplaytree(node234 thisnode, int level, int childnumber) }}

最後給一張234樹新增操作演變過程圖

資料結構之2 3 4樹

2 3 4樹是一種階為4的b樹。它是一種自平衡的資料結構,可以在o lgn 的時間內查詢 插入和刪除,這裡的n是樹中元素的數目。2 3 4樹和紅黑樹是等價的,也就是每個紅黑樹都可以轉化為一顆2 3 4樹,每個選擇操作也和2 3 4樹中的 操作對應。2 3 4樹是這樣一種資料結構,滿足如下性質 1 每...

資料結構與演算法之2 3 4樹

外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img y3sprlm2 1615947159678 不太平衡的二叉樹 對於乙個普通的二叉查詢樹,我們可以發現乙個問題,存在一定的可能性,一般的二叉查詢樹會退化成一般的鍊錶.上圖還沒有完全退化,但是如果查詢6這個結點,會比其他的葉子結點走更...

資料結構 2 3 4樹與紅黑樹

前面講到了2 3樹,2 3樹是允許節點最多有三個子節點的樹,2 3樹中有2節點和3節點,2節點跟普通的二叉樹節點一樣,3節點ab就是的左子樹上的所有節點的值小於a,中子樹上所有節點的值大於a而小於b,右子樹上節點的值大於b。2 3樹是一種平衡樹。2 3 4樹跟2 3樹差不多,只不過是把節點的最大子節...