Advertisement
dica14

Untitled

Nov 23rd, 2014
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.56 KB | None | 0 0
  1. #include <iostream.h>
  2. #include <stdlib.h>
  3. #include <alloc.h>
  4. const int MAX = 4 ;
  5. const int MIN = 2 ;
  6. struct btnode
  7. {
  8. int count ;
  9. int value[MAX + 1] ;
  10. btnode *child[MAX + 1] ;
  11. } ;
  12. class btree
  13. {
  14. private :
  15. btnode *root ;
  16. public :
  17. btree( ) ;
  18. void insert ( int val ) ;
  19. int setval ( int val, btnode *n, int *p, btnode **c ) ;
  20. static btnode * search ( int val, btnode *root, int *pos ) ;
  21. static int searchnode ( int val, btnode *n, int *pos ) ;
  22. void fillnode ( int val, btnode *c, btnode *n, int k ) ;
  23. void split ( int val, btnode *c, btnode *n,
  24. int k, int *y, btnode **newnode ) ;
  25. void del ( int val ) ;
  26. int delhelp ( int val, btnode *root ) ;
  27. void clear ( btnode *root, int k ) ;
  28. void copysucc ( btnode *root, int i ) ;
  29. void restore ( btnode *root, int i ) ;
  30. void rightshift ( int k ) ;
  31. void leftshift ( int k ) ;
  32. void merge ( int k ) ;
  33. void show( ) ;
  34. static void display ( btnode *root ) ;
  35. static void deltree ( btnode *root ) ;
  36. ~btree( ) ;
  37. } ;
  38.  
  39. btree :: btree( )
  40. {
  41. root = NULL ;
  42. }
  43. void btree :: insert ( int val )
  44. {
  45. int i ;
  46. btnode *c, *n ;
  47. int flag ;
  48. flag = setval ( val, root, &i, &c ) ;
  49. if ( flag )
  50. {
  51. n = new btnode ;
  52. n -> count = 1 ;
  53. n -> value[1] = i ;
  54. n -> child[0] = root ;
  55. n -> child[1] = c ;
  56. root = n ;
  57. }
  58. }
  59. int btree :: setval ( int val, btnode *n, int *p, btnode **c )
  60. {
  61. int k ;
  62. if ( n == NULL )
  63. {
  64. *p = val ;
  65. *c = NULL ;
  66. return 1 ;
  67. }
  68. else
  69. {
  70. if ( searchnode ( val, n, &k ) )
  71. cout << endl << "Key value already exists." << endl ;
  72. if ( setval ( val, n -> child[k], p, c ) )
  73. {
  74. if ( n -> count < MAX )
  75. {
  76. fillnode ( *p, *c, n, k ) ;
  77. return 0 ;
  78. }
  79. else
  80. {
  81. split ( *p, *c, n, k, p, c ) ;
  82. return 1 ;
  83. }
  84. }
  85. return 0 ;
  86. }
  87. }
  88. btnode * btree :: search ( int val, btnode *root, int *pos )
  89. {
  90. if ( root == NULL )
  91. return NULL ;
  92. else
  93. {
  94. if ( searchnode ( val, root, pos ) )
  95. return root ;
  96. else
  97. return search ( val, root -> child[*pos], pos ) ;
  98. }
  99. }
  100. int btree :: searchnode ( int val, btnode *n, int *pos )
  101. {
  102. if ( val < n -> value[1] )
  103. {
  104. *pos = 0 ;
  105. return 0 ;
  106. }
  107. else
  108. {
  109. *pos = n -> count ;
  110. while ( ( val < n -> value[*pos] ) && *pos > 1 )
  111. ( *pos )-- ;
  112. if ( val == n -> value[*pos] )
  113. return 1 ;
  114. else
  115. return 0 ;
  116. }
  117. }
  118. void btree :: fillnode ( int val, btnode *c, btnode *n, int k )
  119. {
  120. int i ;
  121. for ( i = n -> count ; i > k ; i-- )
  122. {
  123. n -> value[i + 1] = n -> value[i] ;
  124. n -> child[i + 1] = n -> child[i] ;
  125. }
  126. n -> value[k + 1] = val ;
  127. n -> child[k + 1] = c ;
  128. n -> count++ ;
  129. }
  130. void btree :: split ( int val, btnode *c, btnode *n,
  131. int k, int *y, btnode **newnode )
  132. {
  133. int i, mid ;
  134.  
  135. if ( k <= MIN )
  136. mid = MIN ;
  137. else
  138. mid = MIN + 1 ;
  139.  
  140. *newnode = new btnode ;
  141.  
  142. for ( i = mid + 1 ; i <= MAX ; i++ )
  143. {
  144. ( *newnode ) -> value[i - mid] = n -> value[i] ;
  145. ( *newnode ) -> child[i - mid] = n -> child[i] ;
  146. }
  147.  
  148. ( *newnode ) -> count = MAX - mid ;
  149. n -> count = mid ;
  150.  
  151. if ( k <= MIN )
  152. fillnode ( val, c, n, k ) ;
  153. else
  154. fillnode ( val, c, *newnode, k - mid ) ;
  155.  
  156. *y = n -> value[n -> count] ;
  157. ( *newnode ) -> child[0] = n -> child[n -> count] ;
  158. n -> count-- ;
  159. }
  160. void btree :: del ( int val )
  161. {
  162. btnode * temp ;
  163.  
  164. if ( ! delhelp ( val, root ) )
  165. cout << endl << "Value " << val << " not found." ;
  166. else
  167. {
  168. if ( root -> count == 0 )
  169. {
  170. temp = root ;
  171. root = root -> child[0] ;
  172. delete temp ;
  173. }
  174. }
  175. }
  176. int btree :: delhelp ( int val, btnode *root )
  177. {
  178. int i ;
  179. int flag ;
  180.  
  181. if ( root == NULL )
  182. return 0 ;
  183. else
  184. {
  185. flag = searchnode ( val, root, &i ) ;
  186. if ( flag )
  187. {
  188. if ( root -> child[i - 1] )
  189. {
  190. copysucc ( root, i ) ;
  191. flag = delhelp ( root -> value[i], root -> child[i] ) ;
  192. if ( !flag )
  193. cout << endl << "Value " << val << " not found." ;
  194. }
  195. else
  196. clear ( root, i ) ;
  197. }
  198. else
  199. flag = delhelp ( val, root -> child[i] ) ;
  200. if ( root -> child[i] != NULL )
  201. {
  202. if ( root -> child[i] -> count < MIN )
  203. restore ( root, i ) ;
  204. }
  205. return flag ;
  206. }
  207. }
  208. void btree :: clear ( btnode *root, int k )
  209. {
  210. int i ;
  211. for ( i = k + 1 ; i <= root -> count ; i++ )
  212. {
  213. root -> value[i - 1] = root -> value[i] ;
  214. root -> child[i - 1] = root -> child[i] ;
  215. }
  216. root -> count-- ;
  217. }
  218. void btree :: copysucc ( btnode *root, int i )
  219. {
  220. btnode *temp = root -> child[i] ;
  221.  
  222. while ( temp -> child[0] )
  223. temp = temp -> child[0] ;
  224.  
  225. root -> value[i] = temp -> value[1] ;
  226. }
  227. void btree :: restore ( btnode *root, int i )
  228. {
  229. if ( i == 0 )
  230. {
  231. if ( root -> child [1] -> count > MIN )
  232. leftshift ( 1 ) ;
  233. else
  234. merge ( 1 ) ;
  235. }
  236. else
  237. {
  238. if ( i == root -> count )
  239. {
  240. if ( root -> child[i - 1] -> count > MIN )
  241. rightshift ( i ) ;
  242. else
  243. merge ( i ) ;
  244. }
  245. else
  246. {
  247. if ( root -> child[i - 1] -> count > MIN )
  248. rightshift ( i ) ;
  249. else
  250. {
  251. if ( root -> child[i + 1] -> count > MIN )
  252. leftshift ( i + 1 ) ;
  253. else
  254. merge ( i ) ;
  255. }
  256. }
  257. }
  258. }
  259. void btree :: rightshift ( int k )
  260. {
  261. int i ;
  262. btnode *temp ;
  263.  
  264. temp = root -> child[k] ;
  265.  
  266. for ( i = temp -> count ; i > 0 ; i-- )
  267. {
  268. temp -> value[i + 1] = temp -> value[i] ;
  269. temp -> child[i + 1] = temp -> child[i] ;
  270. }
  271.  
  272. temp -> child[1] = temp -> child[0] ;
  273. temp -> count++ ;
  274. temp -> value[1] = root -> value[k] ;
  275. temp = root -> child[k - 1] ;
  276. root -> value[k] = temp -> value[temp -> count] ;
  277. root -> child[k] -> child [0] = temp -> child[temp -> count] ;
  278. temp -> count-- ;
  279. }
  280. void btree :: leftshift ( int k )
  281. {
  282. btnode *temp ;
  283.  
  284. temp = root -> child[k - 1] ;
  285. temp -> count++ ;
  286. temp -> value[temp -> count] = root -> value[k] ;
  287. temp -> child[temp -> count] = root -> child[k] -> child[0] ;
  288. temp = root -> child[k] ;
  289. root -> value[k] = temp -> value[1] ;
  290. temp -> child[0] = temp -> child[1] ;
  291. temp -> count-- ;
  292. for ( int i = 1 ; i <= temp -> count ; i++ )
  293. {
  294. temp -> value[i] = temp -> value[i + 1] ;
  295. temp -> child[i] = temp -> child[i + 1] ;
  296. }
  297. }
  298. void btree :: merge ( int k )
  299. {
  300. btnode *temp1, *temp2 ;
  301. temp1 = root -> child[k] ;
  302. temp2 = root -> child[k - 1] ;
  303. temp2 -> count++ ;
  304. temp2 -> value[temp2 -> count] = root -> value[k] ;
  305. temp2 -> child[temp2 -> count] = root -> child[0] ;
  306. for ( int i = 1 ; i <= temp1 -> count ; i++ )
  307. {
  308. temp2 -> count++ ;
  309. temp2 -> value[temp2 -> count] = temp1 -> value[i] ;
  310. temp2 -> child[temp2 -> count] = temp1 -> child[i] ;
  311. }
  312. for ( i = k ; i < root -> count ; i++ )
  313. {
  314. root -> value[i] = root -> value[i + 1] ;
  315. root -> child[i] = root -> child[i + 1] ;
  316. }
  317. root -> count-- ;
  318. delete temp1 ;
  319. }
  320. void btree :: show( )
  321. {
  322. display ( root ) ;
  323. }
  324. void btree :: display ( btnode *root )
  325. {
  326. if ( root != NULL )
  327. {
  328. for ( int i = 0 ; i < root -> count ; i++ )
  329. {
  330. display ( root -> child[i] ) ;
  331. cout << root -> value[i + 1] << "\t" ;
  332. }
  333. display ( root -> child[i] ) ;
  334. }
  335. }
  336. void btree :: deltree ( btnode *root )
  337. {
  338. if ( root != NULL )
  339. {
  340. for ( int i = 0 ; i < root -> count ; i++ )
  341. {
  342. deltree ( root -> child[i] ) ;
  343. delete ( root -> child[i] ) ;
  344. }
  345. deltree ( root -> child[i] ) ;
  346. delete ( root -> child[i] ) ;
  347. }
  348. }
  349.  
  350. btree :: ~btree( )
  351. {
  352. deltree ( root ) ;
  353. }
  354.  
  355. void main( )
  356. {
  357. btree b ;
  358. int arr[ ] = { 27, 42, 22, 47, 32, 2, 51, 40, 13 } ;
  359. int sz = sizeof ( arr ) / sizeof ( int ) ;
  360. for ( int i = 0 ; i < sz ; i++ )
  361. b.insert ( arr[i] ) ;
  362. cout << "B-tree of order 5:" << endl ;
  363. b.show( ) ;
  364. b.del ( 22 ) ;
  365. b.del ( 11 ) ;
  366. cout << "\n\nB-tree after deletion of values:" << endl ;
  367. b.show( ) ;
  368. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement