第十五周專案 B 樹的基本操作

2021-07-08 16:37:30 字數 3109 閱讀 4749

主函式

#include #include #define maxm 10                     //定義b-樹的最大的階數

typedef int keytype; //keytype為關鍵字型別

typedef struct node //b-樹結點型別定義

btnode;

typedef struct //b-樹的查詢結果型別

result;

int m; //m階b-樹,為全域性變數

int max; //m階b-樹中每個結點的至多關鍵字個數,max=m-1

int min; //m階b-樹中非葉子結點的至少關鍵字個數,min=(m-1)/2

int search(btnode *p,keytype k)

result searchbtree(btnode *t,keytype k)

}r.i=i;

if (found==1) //查詢成功

else //查詢不成功,返回k的插入位置資訊

return r; //返回k的位置(或插入位置)

}void insert(btnode *&q,int i,keytype x,btnode *ap)

q->key[i+1]=x;

q->ptr[i+1]=ap;

if (ap!=null) ap->parent=q;

q->keynum++;

}void split(btnode *&q,btnode *&ap)

ap->keynum=q->keynum-s;

ap->parent=q->parent;

for (i=0; i<=q->keynum-s; i++) //修改指向雙親結點的指標

if (ap->ptr[i]!=null) ap->ptr[i]->parent = ap;

q->keynum=s-1; //q的前一半保留,修改keynum

}void newroot(btnode *&t,btnode *p,keytype x,btnode *ap)

void insertbtree(btnode *&t, keytype k, btnode *q, int i)

else neednewroot=1;}}

if (neednewroot==1) //根結點已**為結點*q和*ap

newroot(t,q,x,ap); //生成新根結點*t,q和ap為子樹指標

}}void dispbtree(btnode *t) //以括號表示法輸出b-樹

dispbtree(t->ptr[t->keynum]);

if (t->ptr[0]!=0) printf(")"); //至少有乙個子樹時輸出")"號}}

}void remove(btnode *p,int i)

//從*p結點刪除key[i]和它的孩子指標ptr[i]

p->keynum--;

}void successor(btnode *p,int i)

//查詢被刪關鍵字p->key[i](在非葉子結點中)的替代葉子結點

void moveright(btnode *p,int i)

//把乙個關鍵字移動到右兄弟中

t->ptr[1]=t->ptr[0]; //從雙親結點移動關鍵字到右兄弟中

t->keynum++;

t->key[1]=p->key[i];

t=p->ptr[i-1]; //將左兄弟中最後乙個關鍵字移動到雙親結點中

p->key[i]=t->key[t->keynum];

p->ptr[i]->ptr[0]=t->ptr[t->keynum];

t->keynum--;

}void moveleft(btnode *p,int i)

//把乙個關鍵字移動到左兄弟中

}void combine(btnode *p,int i)

//將三個結點合併到乙個結點中

for (c=i; ckeynum; c++) //刪除父結點所有的關鍵字

p->keynum--;

free(q); //釋放空右結點的空間

}void restore(btnode *p,int i)

//關鍵字刪除後,調整b-樹,找到乙個關鍵字將其插入到p->ptr[i]中

int searchnode(keytype k,btnode *p,int &i)

//在結點p中找關鍵字為k的位置i,成功時返回1,否則返回0

else //在*p結點中查詢

}int recdelete(keytype k,btnode *p)

//查詢並刪除關鍵字k

else

remove(p,i); //從*p結點中位置i處刪除關鍵字

}else

found=recdelete(k,p->ptr[i]); //沿孩子結點遞迴查詢並刪除關鍵字k

if (p->ptr[i]!=null)

if (p->ptr[i]->keynumkeynum==0)

}int main()

,k; m=3; //3階b-樹

max=m-1;

min=(m-1)/2;

printf("建立一棵%d階b-樹:\n",m);

for (j=0; j

運算結果

第十五周專案三 B 樹的基本操作

問題及 all right reserved.檔名稱 b 樹的基本操作.cpp 版本號 v1.0 問題描述 實現b 樹的基本操作。基於序列完成測試。1 建立對應的3階b 樹b,用括號法輸出b樹。2 從b中分別刪除關鍵字為8和1的節點,用括號法輸出刪除節點後的b樹。程式輸出 根據題目要求輸出。incl...

第十五周 專案三 B 樹的基本操作

檔名稱 test.cpp 完成日期 2015年12月7日 問題描述 實現b 樹的基本操作。基於序列完成測試。1 建立對應的3階b 樹b,用括號法輸出b樹。2 從b中分別刪除關鍵字為8和1的節點,用括號法輸出刪除節點後的b樹。include include define maxm 10 定義b 樹的最...

第十五周專案3B 樹的基本操作

實現b 樹的基本操作。基於序列完成測試。1 建立對應的3階b 樹b,用括號法輸出b樹。2 從b中分別刪除關鍵字為8和1的節點,用括號法輸出刪除節點後的b樹。include include define maxm 10 定義b 樹的最大的階數 typedef int keytype keytype為關...