2 3樹 Java實現部分演算法

2021-06-17 17:19:14 字數 2342 閱讀 5654

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...