#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)
#define getl(p) (p==null?null:p->leftnode)
#define getm(p) (p==null?null:p->midnode)
#define nil null;
#define null null;
/***title:2-3tree
*time:2019-3-23 11:04:04
*author:srv-330**/
//樹結點
typedef struct treenodetn,*ptn;
//修復
void fixup(ptn p,ptn *root);
ptn createtreenode(int value);//建立乙個樹結點
//交換
void change(int* a,int* b);
//插入乙個結點
ptn inserttreenode(ptn p,ptn* rootp)else
}else if(num(move)==2)else if(value>move->value[1])else
}tm=getm(move);
tr=getr(move);
tl=getl(move); }
if(num(move)==1)else if(num(move)==2)else
}//建立乙個樹結點
ptn createtreenode(int value)
//輸出這個樹的資訊
void printtree(ptn root,int deep)
printtree(root->midnode,deep);//輸入這個樹的中間結點的資訊
for(int j=0;jvalue[0]);//輸出陣列value(0)的值
printtree(root->leftnode,deep);//再遍歷左結點
//這是乙個23 樹 只有兩個值 分別儲存在value[0]和value[1]中 }
//交換a,b 在給value陣列排序的時候將會用到
void change(int *a,int *b)
void fixup(ptn p,ptn *root)else if(num(move)==3&&num(movep)==1&&getl(movep)==move)else if(num(move)==3&&num(movep)==1&&getr(movep)==move)else if(num(move)==3&&num(movep)==2&&getl(movep)==move)else if(num(move)==3&&num(movep)==2&&getm(movep)==move)else if(num(move)==3&&num(movep)==2&&getr(movep)==move)else }
//銷毀樹 釋放每個結點指向的空間 也用到了遞迴的思想
void droptree(ptn root)
if(root->rightnode)
if(root->midnode)
if(root->tmpnode)
free(root);
root=null;
}main()while(node!=null);
printtree(root,0);
droptree(root);
}
對於2-3樹的具體實現過程 比較抽象 這裡附上**方便以後呼叫新增鏈結描述 2 3樹 Java實現部分演算法
2 3樹是一種樹結構型別的檢索樹,符合下面的定義 1 乙個節點包含乙個或兩個關鍵碼 2 每個內部結點有兩個子女 如果它包含乙個關鍵碼 或三個子女 如果它包含三個關鍵碼 3 所有葉結點都在樹的同一層,因此樹的高度總是平衡的 4 對於每個結點,其左子樹的所有後繼結點都小於第乙個關鍵碼的值,而其中間子樹的...
2 3樹的插入
2 3樹所有葉子都在同乙個層次,也就是說每一層的葉子數目都是相等的,如圖 一 插入資料3,插入的時候從根結點8發現,比8大往左走,到達4,發現比4小,繼續往左走,然後發現比1大,並且此時1結點只有乙個結點,所以可以插入,如圖 二.插入5 插入的時候從根結點8發現,比8大往左走,到達4,發現比4大,繼...
23 樹與樹演算法
樹 英語 tree 是一種抽象資料型別 adt 或是實作這種抽象資料型別的資料結構,用來模擬具有樹狀結構性質的資料集合。它是由n n 1 個有限節點組成乙個具有層次關係的集合。把它叫做 樹 是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點 比如說 無序樹 樹中任意節點的...