Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream.h>
- #include <stdlib.h>
- #include <alloc.h>
- const int MAX = 4 ;
- const int MIN = 2 ;
- struct btnode
- {
- int count ;
- int value[MAX + 1] ;
- btnode *child[MAX + 1] ;
- } ;
- class btree
- {
- private :
- btnode *root ;
- public :
- btree( ) ;
- void insert ( int val ) ;
- int setval ( int val, btnode *n, int *p, btnode **c ) ;
- static btnode * search ( int val, btnode *root, int *pos ) ;
- static int searchnode ( int val, btnode *n, int *pos ) ;
- void fillnode ( int val, btnode *c, btnode *n, int k ) ;
- void split ( int val, btnode *c, btnode *n,
- int k, int *y, btnode **newnode ) ;
- void del ( int val ) ;
- int delhelp ( int val, btnode *root ) ;
- void clear ( btnode *root, int k ) ;
- void copysucc ( btnode *root, int i ) ;
- void restore ( btnode *root, int i ) ;
- void rightshift ( int k ) ;
- void leftshift ( int k ) ;
- void merge ( int k ) ;
- void show( ) ;
- static void display ( btnode *root ) ;
- static void deltree ( btnode *root ) ;
- ~btree( ) ;
- } ;
- btree :: btree( )
- {
- root = NULL ;
- }
- void btree :: insert ( int val )
- {
- int i ;
- btnode *c, *n ;
- int flag ;
- flag = setval ( val, root, &i, &c ) ;
- if ( flag )
- {
- n = new btnode ;
- n -> count = 1 ;
- n -> value[1] = i ;
- n -> child[0] = root ;
- n -> child[1] = c ;
- root = n ;
- }
- }
- int btree :: setval ( int val, btnode *n, int *p, btnode **c )
- {
- int k ;
- if ( n == NULL )
- {
- *p = val ;
- *c = NULL ;
- return 1 ;
- }
- else
- {
- if ( searchnode ( val, n, &k ) )
- cout << endl << "Key value already exists." << endl ;
- if ( setval ( val, n -> child[k], p, c ) )
- {
- if ( n -> count < MAX )
- {
- fillnode ( *p, *c, n, k ) ;
- return 0 ;
- }
- else
- {
- split ( *p, *c, n, k, p, c ) ;
- return 1 ;
- }
- }
- return 0 ;
- }
- }
- btnode * btree :: search ( int val, btnode *root, int *pos )
- {
- if ( root == NULL )
- return NULL ;
- else
- {
- if ( searchnode ( val, root, pos ) )
- return root ;
- else
- return search ( val, root -> child[*pos], pos ) ;
- }
- }
- int btree :: searchnode ( int val, btnode *n, int *pos )
- {
- if ( val < n -> value[1] )
- {
- *pos = 0 ;
- return 0 ;
- }
- else
- {
- *pos = n -> count ;
- while ( ( val < n -> value[*pos] ) && *pos > 1 )
- ( *pos )-- ;
- if ( val == n -> value[*pos] )
- return 1 ;
- else
- return 0 ;
- }
- }
- void btree :: fillnode ( int val, btnode *c, btnode *n, int k )
- {
- int i ;
- for ( i = n -> count ; i > k ; i-- )
- {
- n -> value[i + 1] = n -> value[i] ;
- n -> child[i + 1] = n -> child[i] ;
- }
- n -> value[k + 1] = val ;
- n -> child[k + 1] = c ;
- n -> count++ ;
- }
- void btree :: split ( int val, btnode *c, btnode *n,
- int k, int *y, btnode **newnode )
- {
- int i, mid ;
- if ( k <= MIN )
- mid = MIN ;
- else
- mid = MIN + 1 ;
- *newnode = new btnode ;
- for ( i = mid + 1 ; i <= MAX ; i++ )
- {
- ( *newnode ) -> value[i - mid] = n -> value[i] ;
- ( *newnode ) -> child[i - mid] = n -> child[i] ;
- }
- ( *newnode ) -> count = MAX - mid ;
- n -> count = mid ;
- if ( k <= MIN )
- fillnode ( val, c, n, k ) ;
- else
- fillnode ( val, c, *newnode, k - mid ) ;
- *y = n -> value[n -> count] ;
- ( *newnode ) -> child[0] = n -> child[n -> count] ;
- n -> count-- ;
- }
- void btree :: del ( int val )
- {
- btnode * temp ;
- if ( ! delhelp ( val, root ) )
- cout << endl << "Value " << val << " not found." ;
- else
- {
- if ( root -> count == 0 )
- {
- temp = root ;
- root = root -> child[0] ;
- delete temp ;
- }
- }
- }
- int btree :: delhelp ( int val, btnode *root )
- {
- int i ;
- int flag ;
- if ( root == NULL )
- return 0 ;
- else
- {
- flag = searchnode ( val, root, &i ) ;
- if ( flag )
- {
- if ( root -> child[i - 1] )
- {
- copysucc ( root, i ) ;
- flag = delhelp ( root -> value[i], root -> child[i] ) ;
- if ( !flag )
- cout << endl << "Value " << val << " not found." ;
- }
- else
- clear ( root, i ) ;
- }
- else
- flag = delhelp ( val, root -> child[i] ) ;
- if ( root -> child[i] != NULL )
- {
- if ( root -> child[i] -> count < MIN )
- restore ( root, i ) ;
- }
- return flag ;
- }
- }
- void btree :: clear ( btnode *root, int k )
- {
- int i ;
- for ( i = k + 1 ; i <= root -> count ; i++ )
- {
- root -> value[i - 1] = root -> value[i] ;
- root -> child[i - 1] = root -> child[i] ;
- }
- root -> count-- ;
- }
- void btree :: copysucc ( btnode *root, int i )
- {
- btnode *temp = root -> child[i] ;
- while ( temp -> child[0] )
- temp = temp -> child[0] ;
- root -> value[i] = temp -> value[1] ;
- }
- void btree :: restore ( btnode *root, int i )
- {
- if ( i == 0 )
- {
- if ( root -> child [1] -> count > MIN )
- leftshift ( 1 ) ;
- else
- merge ( 1 ) ;
- }
- else
- {
- if ( i == root -> count )
- {
- if ( root -> child[i - 1] -> count > MIN )
- rightshift ( i ) ;
- else
- merge ( i ) ;
- }
- else
- {
- if ( root -> child[i - 1] -> count > MIN )
- rightshift ( i ) ;
- else
- {
- if ( root -> child[i + 1] -> count > MIN )
- leftshift ( i + 1 ) ;
- else
- merge ( i ) ;
- }
- }
- }
- }
- void btree :: rightshift ( int k )
- {
- int i ;
- btnode *temp ;
- temp = root -> child[k] ;
- for ( i = temp -> count ; i > 0 ; i-- )
- {
- temp -> value[i + 1] = temp -> value[i] ;
- temp -> child[i + 1] = temp -> child[i] ;
- }
- temp -> child[1] = temp -> child[0] ;
- temp -> count++ ;
- temp -> value[1] = root -> value[k] ;
- temp = root -> child[k - 1] ;
- root -> value[k] = temp -> value[temp -> count] ;
- root -> child[k] -> child [0] = temp -> child[temp -> count] ;
- temp -> count-- ;
- }
- void btree :: leftshift ( int k )
- {
- btnode *temp ;
- temp = root -> child[k - 1] ;
- temp -> count++ ;
- temp -> value[temp -> count] = root -> value[k] ;
- temp -> child[temp -> count] = root -> child[k] -> child[0] ;
- temp = root -> child[k] ;
- root -> value[k] = temp -> value[1] ;
- temp -> child[0] = temp -> child[1] ;
- temp -> count-- ;
- for ( int i = 1 ; i <= temp -> count ; i++ )
- {
- temp -> value[i] = temp -> value[i + 1] ;
- temp -> child[i] = temp -> child[i + 1] ;
- }
- }
- void btree :: merge ( int k )
- {
- btnode *temp1, *temp2 ;
- temp1 = root -> child[k] ;
- temp2 = root -> child[k - 1] ;
- temp2 -> count++ ;
- temp2 -> value[temp2 -> count] = root -> value[k] ;
- temp2 -> child[temp2 -> count] = root -> child[0] ;
- for ( int i = 1 ; i <= temp1 -> count ; i++ )
- {
- temp2 -> count++ ;
- temp2 -> value[temp2 -> count] = temp1 -> value[i] ;
- temp2 -> child[temp2 -> count] = temp1 -> child[i] ;
- }
- for ( i = k ; i < root -> count ; i++ )
- {
- root -> value[i] = root -> value[i + 1] ;
- root -> child[i] = root -> child[i + 1] ;
- }
- root -> count-- ;
- delete temp1 ;
- }
- void btree :: show( )
- {
- display ( root ) ;
- }
- void btree :: display ( btnode *root )
- {
- if ( root != NULL )
- {
- for ( int i = 0 ; i < root -> count ; i++ )
- {
- display ( root -> child[i] ) ;
- cout << root -> value[i + 1] << "\t" ;
- }
- display ( root -> child[i] ) ;
- }
- }
- void btree :: deltree ( btnode *root )
- {
- if ( root != NULL )
- {
- for ( int i = 0 ; i < root -> count ; i++ )
- {
- deltree ( root -> child[i] ) ;
- delete ( root -> child[i] ) ;
- }
- deltree ( root -> child[i] ) ;
- delete ( root -> child[i] ) ;
- }
- }
- btree :: ~btree( )
- {
- deltree ( root ) ;
- }
- void main( )
- {
- btree b ;
- int arr[ ] = { 27, 42, 22, 47, 32, 2, 51, 40, 13 } ;
- int sz = sizeof ( arr ) / sizeof ( int ) ;
- for ( int i = 0 ; i < sz ; i++ )
- b.insert ( arr[i] ) ;
- cout << "B-tree of order 5:" << endl ;
- b.show( ) ;
- b.del ( 22 ) ;
- b.del ( 11 ) ;
- cout << "\n\nB-tree after deletion of values:" << endl ;
- b.show( ) ;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement