/*
* 煙台大學計算機與控制工程學院
* 完成日期: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為關...