Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

B+ 트리를 구현하는 C++ 프로그램

<시간/>

B+ 트리는 노드가 두 개 이상의 자식을 가질 수 있다는 점에서 이진 탐색 트리의 일반화입니다. 기본적으로 정렬된 데이터를 유지하고 로그 시간에 순차적인 액세스, 검색, 삽입 및 삭제를 허용하는 자체 균형 트리 데이터 구조입니다.

각 노드에는 키만 포함되고 하단에 연결된 잎으로 추가 수준이 추가되는 B-트리로 볼 수 있습니다.

알고리즘

노드를 트리에 삽입하기 위해 insert() 함수를 시작합니다. x를 루트로 초기화합니다. x가 리프이고 하나 이상의 정보를 위한 공간이 있는 경우 x에 a를 삽입합니다. 그렇지 않으면 x가 리프가 아닌 경우 다음에 탐색할 x의 자식을 찾습니다. 자식이 가득 차 있지 않으면 x를 자식을 가리키도록 변경합니다. 자식이 가득 차면 분할하고 x를 자식의 두 부분 중 하나를 가리키도록 변경합니다. 자식의 중간 키보다 작은 경우 x를 자식의 첫 번째 부분으로 설정합니다. 자식의 다른 두 번째 부분.End

예시 코드

#include네임스페이스 std;struct BplusTree 사용 { int *d; BplusTree **child_ptr; 부울 엘; int n;}*r =NULL, *np =NULL, *x =NULL;BplusTree* init()//노드 생성 { int i; np =새로운 BplusTree; np->d =new int[6];//주문 6 np->child_ptr =new BplusTree *[7]; np->l =참; np->n =0; for (i =0; i <7; i++) { np->child_ptr[i] =NULL; } return np;} 무효 트래버스(BplusTree *p)//트리 트래버스 { cout<n; i++) { if (p->l ==false) { traverse(p->child_ptr[i]); } cout <<" " <d[i]; } if (p->l ==false) { traverse(p->child_ptr[i]); } cout<p[j]) { t =p[i]; p[i] =p[j]; p[j] =t; } } }}int split_child(BplusTree *x, int i) { int j, mid; BplusTree *np1, *np3, *y; np3 =초기화(); np3->l =참; if (i ==-1) { 중간 =x->d[2]; x->d[2] =0; x->n--; np1 =초기화(); np1->l =거짓; x->l =참; for (j =3; j <6; j++) { np3->d[j - 3] =x->d[j]; np3->child_ptr[j - 3] =x->child_ptr[j]; np3->n++; x->d[j] =0; x->n--; } for (j =0; j <6; j++) { x->child_ptr[j] =NULL; } np1->d[0] =중간; np1->child_ptr[np1->n] =x; np1->child_ptr[np1->n + 1] =np3; np1->n++; r =np1; } else { y =x->child_ptr[i]; 중간 =y->d[2]; y->d[2] =0; y->n--; for (j =3; j <6; j++) { np3->d[j - 3] =y->d[j]; np3->n++; y->d[j] =0; y->n--; } x->child_ptr[i + 1] =y; x->child_ptr[i + 1] =np3; } return mid;}void insert(int a) { int i, t; x =r; if (x ==NULL) { r =초기화(); x =r; } else { if (x->l==true &&x->n ==6) { t =split_child(x, -1); x =r; for (i =0; i <(x->n); i++) { if ((a>x->d[i]) &&(a d[i + 1])) { i++; 부서지다; } else if (a d[0]) { break; } else { 계속; } } x =x->자식_ptr[i]; } else { while (x->l ==false) { for (i =0; i <(x->n); i++) { if ((a>x->d[i]) &&(a  d[i + 1])) { i++; 부서지다; } else if (a d[0]) { break; } else { 계속; } } if ((x->child_ptr[i])->n ==6) { t =split_child(x, i); x->d[x->n] =t; x->n++; 계속하다; } else { x =x->child_ptr[i]; } } }} x->d[x->n] =a; 정렬(x->d, x->n); x->n++;}int main() { int i, n, t; cout<<"삽입할 요소의 개수를 입력하세요\n"; 신>>n; for(i =0; i >t; 삽입(t); } cout<<"구성된 B 트리 순회\n"; 트래버스(r);}

출력

삽입할 요소의 수를 입력10요소를 입력10요소를 입력20요소를 입력30요소를 입력40요소를 입력50요소를 입력60요소를 입력70요소를 입력80요소를 입력90요소를 입력100구성된 B 트리의 순회10 203040 506070 80 90> 100