2-3樹是一種樹結構型別的檢索樹,符合下面的定義:
1、乙個節點包含乙個或兩個關鍵碼
2、每個內部結點有兩個子女(如果它包含乙個關鍵碼)或三個子女(如果它包含三個關鍵碼)
3、所有葉結點都在樹的同一層,因此樹的高度總是平衡的
4、對於每個結點,其左子樹的所有後繼結點都小於第乙個關鍵碼的值,而其中間子樹的所有結點的值都大於或等於第乙個關鍵碼的值,如果結點有右子樹,那麼其中間子樹的所有後繼結點的值都小於第二個關鍵碼的值,而其右子樹中的所有後繼結點都大於或等於第二個關鍵碼的值
定義乙個結點類,它是樹的內部類
private class ttnode
boolean isleaf()
}
也可以將葉結點和內部結點分開定義以節省空間
private inte***ce varttnode
private class leafttnode implements varttnode
@override
public boolean ifleaf() }
private class intlttnode implements varttnode
@override
public boolean ifleaf()
}
作為檢索樹,最重要的是插入、查詢和刪除,為了簡便,結點類的實現不分開。
**實現查詢
private boolean findhelp(ttnode subroot,object key)
if((int)subroot.rkey != -1 && (int)key == (int)subroot.rkey)
if((int)key < (int)subroot.lkey)
else if((int)subroot.rkey == -1)
else if((int)key < (int)subroot.rkey)
else
}
往2-3樹中插入資料較為複雜,如下分析
1、往2-3樹中插入關鍵碼如bst中一樣,是放到相應的葉結點。
2、與bst不同的是,2-3樹不建立子女結點來放置插入的記錄,即2-3樹不向下生長
3、第一步,首先找到要插入的葉結點的位置,如果該葉結點只有乙個關鍵碼,直接插入,不需要修改
4、如果該葉結點有兩個關鍵碼,那麼就需要建立更多的空間,假設要插入的結點是n,按如下步驟**n
a、先把n**成兩個結點,為n和n『,n得到三個關鍵碼中最小的值,n'得到最大的,中間的關鍵碼值和n'一起傳回父結點,這成為一次提公升
b、如果父結點只有乙個值,直接將中間的關鍵碼插入,如果父結點已滿,那麼就重複進行**。
**實現
首先實現**函式
//**函式引數subroot要**的結點,inval是要插入的值,也可以是下面公升上來的值,
//inptr是下面公升上來的子樹,retptr是**的子樹
public object splitnode(ttnode subroot,object inval,ttnode inptr,ttnode retptr)
else if ((int)inval < (int)subroot.rkey)//中間值是inval,即要插入的值
else
}
返回值是用來傳遞給父結點的中值
插入函式
//subroot是要插入的葉結點,key是插入的關鍵碼,retptr用來指定子樹穿上來的值
public object inserthelp(ttnode subroot,object key,ttnode retptr)
else if(subroot.isleaf())//如果當前結點是葉結點
else //否則
}else //右值不為空
}else if((int)key < (int)subroot.lkey)//如果待插入小於左值
else if((int)subroot.rkey == -1 || (int)key < (int)subroot.rkey)//如果當前節點右值為空或待插入值小於右值
else //其他
if(myretp != null)//如果下面傳遞過來的**子樹不為空
else
else
}} return myretv;
}
2-3樹的刪除非常複雜,因為要保證所有的葉結點都在同一層,所以刪除的有些情況需要合併兄弟結點,參考書上也沒講,所以這個知識點就不深究了,等以後有時間再弄
23 樹與樹演算法
樹 英語 tree 是一種抽象資料型別 adt 或是實作這種抽象資料型別的資料結構,用來模擬具有樹狀結構性質的資料集合。它是由n n 1 個有限節點組成乙個具有層次關係的集合。把它叫做 樹 是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點 比如說 無序樹 樹中任意節點的...
2 3樹的實現
include include include include include include define num p p null?0 p num define getp p p null?null p parent define getr p p null?null p rightnode d...
實現演算法2 3的程式
algo2 3.cpp 實現演算法2.7的程式 include c1.h typedef int elemtype include c2 1.h include bo2 1.cpp include func2 3.cpp 包括equal comp print print2 和print1 函式 vo...