查詢系列之B 樹

2021-06-22 18:05:02 字數 3870 閱讀 4663

一、b_樹的基本結構

//定義的b_樹的儲存結構的節點的結構

typedef struct btnodebitreenode;

二、b_樹的增刪改查

原始碼:

/**

*b-樹

*@author 菜鳥

*@version 2014.7.9

*/#include #include #include #include #define max 3 //max = m-1 m 為該樹結構的階

#define min 0 //min = m/2-1

using namespace std;

typedef int keytype;

int count1 = 0;

int tag1 = 0;

//定義的b_樹的儲存結構的節點的結構

typedef struct btnodebitreenode;

//定義查詢的指標變數的結構體

typedef structsernode;//查詢型別

void bitreeinsert(bitreenode*,sernode *,keytype);

void bitreeoutput(bitreenode*,int);

void operation(bitreenode*,sernode *);

bitreenode* bitreenewnode();

/***查詢結構體的初始化o

*@param sernode *p 表示查詢指標的位址

*@return 無

*/void sernodeinitiate(sernode *p)

cout<<"節點初始化成功!"bitreeoutput(b,i+1);//輸出

if(b->ptr[i+1] != null)

}}/***對乙個節點的掃瞄

*@param sernode *s 表示傳入該結構的空間位址

*@param bitreenode *destination表示要掃瞄的目標

*@param keytype num表示目標資料

*@return 無

*/void getsernodeinformation(bitreenode *destination,sernode *s,keytype num)else

if(num > p->key[s->pos]&&num < p->key[s->pos+1])

if(s->pos > p->keynum)else if(p1->ptr[p->pos] != null)else if(p1->ptr[p->pos] == null)else if(p1->ptr[p->pos-1] == null)else

}cout<<"ser->pos="= max&&p!=null )

acceptnode[1]->parent = p;

int i = 1;

while(i < max-max/2)

acceptnode[2]->parent = p;

count1--;

free(s);

cout<<"**完成!"= max)else

int i = 1;

while(s->key[ser->pos]< s->key[max])

cout<<"**完成!"pos的值

bitreeinsert(acceptnode[0],ser,s->key[max/2+1]);//對新建立的根節點進行插入

acceptnode[0]->parent = null;

for(int i = 1;i >=0 ;i--)

//此時我們需要向這兩個空的節點中賦值

sernodeinitiate(ser);

while(ser->pos < max/2+1)

acceptnode[1]->parent = acceptnode[0];

int i = 1;

while(i < max-max/2)

acceptnode[2]->parent = acceptnode[0];

count1--;

free(s);

return acceptnode[0];//此時返回根節點

}/*else if(p != null&&ser->pos< s->keynum)else

acceptnode[1]->ptr[ser->pos-1] = s->ptr[ser->pos-1];

int i = 1;

while(s->key[ser->pos]< s->key[max])

acceptnode[2]->ptr[i-1] = s->ptr[ser->pos-1];

cout<<"**完成!"p1 = b;

char c = 0;

//此時根節點為空的情況

if(p1->keynum == 0)

if(p1->keynum == 1)

if(num >= p1->key[i]&&p1->ptr[i] != null)*/

if(i+1<=p1->keynum&&num >= p1->key[i]&&num<=p1->key[i+1])else if(num >= p1->key[p1->keynum]&&p1->ptr[p1->keynum]!= null)else if(i == 1&&num key[i]&&p1->ptr[i-1] != null)else

}elseelse

}//這時已經獲取到了位址,那麼我們需要進行插入操作

//插入操作

cout<<"-------------------"p1->key[i] = num;

p1->keynum = p1->keynum+1;

cout<<"插入成功!"i ;j--)

if(count1<=min)else if(c == 'n'|| c == 'n')}}

}}

}else if(p1->keynum >= max)else

} cout<<"p->keynum="p->keynum--;

count1--;

cout<<"刪除成功!--"keynum;i++)else

}if(num >=p->parent->key[a])else

free(p);

count1--;

cout<<"刪除成功!---"}

if(p->parent == null)else}}

cout<<"在父節點中的位置a="ptr[b]!= null)else if(p->ptr[b]->keynum >1&&p->ptr[b-1]->keynum ==1)else

}else if(p->ptr[b-1]== null&&p->ptr[b]!= null)else if(p->ptr[b-1]!= null&&p->ptr[b]== null)

}cout<<"刪除成功!"input;

switch(input)else if(c == 'n'||c == 'n')else

}else

case 2:cout<<"請輸入要查詢的元素:";cin>>num;bitreeserch(root,s,num);operation(root,s);break;

case 3:cout<<"請輸入要刪除的元素:";cin>>num;if(root == null)

}int main()else

bitreenode *root = null;

sernodeinitiate(p);

root = createroot(p);

system("pause");

return 0;

}

索引之B樹 B 樹 B 樹 B 樹

原文索引之b樹 b 樹 b 樹 b 樹 b 樹即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left 和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中...

索引之B樹 B 樹 B 樹 B 樹詳解

索引之b樹 b 樹 b 樹 b 樹 b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則...

多路查詢樹 B數 B 樹 B 樹 原理

1 二叉樹需要載入到記憶體的,如果二叉樹的節點少,沒有什麼問題,但是如果二叉樹的節點很多 此如1億 就存在如下問題 2 問題1 在構建二叉樹時,需要多次進行 o操作海量資料存在資料庫或檔案中 節點海量,構建二叉樹時,速度有影響 3 問題2 節點海量,也會造成二叉樹的高度很大,會降低操作速度 1 在二...