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樹差不多,只不過是把節點的最大子節...