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

2021-07-25 09:39:21 字數 4444 閱讀 1076

/*   

* 煙台大學計算機與控制工程學院  

* 完成日期:2023年12月15日  

*  * 問題描述:

實現b-樹的基本操作。基於序列完成測試。 

(1)建立對應的3階b-樹b,用括號法輸出b樹。 

(2)從b中分別刪除關鍵字為8和1的節點,用括號法輸出刪除節點後的b樹。 

* 輸入描述:

* 程式輸出: */

**:[cpp]view plain

copy

#include 

#include 

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

typedef

intkeytype;                

//keytype為關鍵字型別

typedef

struct

node                 

//b-樹結點型別定義

btnode;  

typedef

struct

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

result;  

intm;                              

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

intmax;                            

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

intmin;                            

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

intsearch(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,

inti,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, 

inti)  

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,

inti)  

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

p->keynum--;  

}  void

successor(btnode *p,

inti)  

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

void

moveright(btnode *p,

inti)  

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

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,

inti)  

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

}  void

combine(btnode *p,

inti)  

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

for(c=i; ckeynum; c++)     

//刪除父結點所有的關鍵字

p->keynum--;  

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

}  void

restore(btnode *p,

inti)  

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

intsearchnode(keytype k,btnode *p,

int&i)  

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

else

//在*p結點中查詢

}  intrecdelete(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]->keynum//刪除後關鍵字個數小於min

restore(p,i);  

return

found;  

}  }  

void

deletebtree(keytype k,btnode *&root)  

//從b-樹root中刪除關鍵字k,若在乙個結點中刪除指定的關鍵字,不再有其他關鍵字,則刪除該結點

}  intmain()  

,k;  

m=3;                                //3階b-樹

max=m-1;  

min=(m-1)/2;  

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

,m);  

for(j=0; j//建立一棵3階b-樹t

printf("  結果b-樹: "

);  

dispbtree(t);  

printf("\n"

);  

printf("刪除操作:\n"

);  

k=8;  

deletebtree(k,t);  

printf("  刪除%d: "

,k);  

printf("b-樹: "

);  

dispbtree(t);  

printf("\n"

);  

k=1;  

deletebtree(k,t);  

printf("  刪除%d: "

,k);  

printf("b-樹: "

);  

dispbtree(t);  

printf("\n"

);  

return

0;  

}  

執行結果:

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

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

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

include include define maxm 10 定義b 樹的最大的階數 typedef int keytype keytype為關鍵字型別 typedef struct node b 樹結點型別定義 btnode typedef struct b 樹的查詢結果型別 result int...

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

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