首页 > 代码库 > Size Balanced Tree
Size Balanced Tree
SBT是一种平衡二叉树结构,它与AVL的不同在于它的自平衡条件是结点的size大于等于其侄子结点的size。SBT的旋转操作与AVL类似,但是有一种较为简便的maintain方法。
由于在结点类中包含了结点的size(它所在的子树的结点个数),我们可以轻易地求得结点数据从小到大的rank并找到第k小的结点。
具体代码如下:
1 //SBTree 2 #include <iostream> 3 using namespace std; 4 5 //结点类 6 template <typename Type> 7 class SBTnode{ 8 public: 9 Type data; 10 int size; 11 SBTnode<Type> *lchild, *rchild, *father; 12 SBTnode(Type init_data, int init_size=0, SBTnode<Type> *init_father=NULL); 13 ~SBTnode(); 14 15 SBTnode<Type>* search(Type value); 16 SBTnode<Type>* predecessor(); 17 SBTnode<Type>* successor(); 18 void remove_node(SBTnode<Type> *delete_node); 19 bool remove(Type value); 20 void inorder(); 21 int Rank(SBTnode<Type> *node); 22 int select(int k); 23 }; 24 25 //this is a trick to make the comparison easier 26 //we can use NIL->size for comparison (but NULL cannot) 27 SBTnode<int> ZERO(0); 28 SBTnode<int> *NIL=&ZERO; 29 30 //结点类的构造 31 //之前已经有过声明,所以ZERO可以调用此构造函数 32 template <typename Type> 33 SBTnode<Type>::SBTnode(Type init_data, int init_size, SBTnode<Type> *init_father){ 34 data=http://www.mamicode.com/init_data; 35 size=init_size; 36 father=init_father; 37 //注意所有child默认初始化为NIL(size=0) 38 lchild=NIL; 39 rchild=NIL; 40 } 41 42 //结点类的析构 43 template <typename Type> 44 SBTnode<Type>::~SBTnode(){ 45 if(lchild!=NIL){ 46 delete lchild; 47 } 48 if(rchild!=NIL){ 49 delete rchild; 50 } 51 } 52 53 //结点类的中序遍历 54 template <typename Type> 55 void SBTnode<Type>::inorder(){ 56 if(lchild!=NIL){ 57 lchild->inorder(); 58 } 59 cout<<data<<" "; 60 if(rchild!=NIL){ 61 rchild->inorder(); 62 } 63 } 64 65 66 //SBT类 67 template <typename Type> 68 class SBT{ 69 private: 70 SBTnode<Type> *root; 71 public: 72 SBT(){ 73 root=NULL; 74 } 75 ~SBT(){ 76 if(root!=NULL) delete root; 77 } 78 79 void insert(Type value); 80 bool find(Type value); 81 bool remove(Type value); 82 void inorder(){ 83 if(root!=NULL) root->inorder(); 84 cout<<endl; 85 } 86 int Rank(Type value); 87 void Display(); 88 int get_size(SBTnode<Type> *node){ 89 return node->size; 90 } 91 int select(int k); 92 }; 93 94 //左旋函数 95 template <typename Type> 96 SBTnode<Type>* left_rotate(SBTnode<Type>* node) { 97 SBTnode<Type>* temp = node->rchild; 98 node->rchild = temp->lchild; 99 temp->lchild->father = node; 100 temp->lchild = node; 101 temp->father = node->father; 102 node->father = temp; 103 temp->size = node->size; 104 node->size = node->lchild->size + node->rchild->size + 1; 105 return temp; 106 } 107 108 //右旋函数 109 template <typename Type> 110 SBTnode<Type>* right_rotate(SBTnode<Type>* node) { 111 SBTnode<Type>* temp = node->lchild; 112 node->lchild = temp->rchild; 113 temp->rchild->father = node; 114 temp->rchild = node; 115 temp->father = node->father; 116 node->father = temp; 117 temp->size = node->size; 118 node->size = node->lchild->size + node->rchild->size + 1; 119 return temp; 120 } 121 122 //maintain函数 123 template <typename Type> 124 SBTnode<Type>* maintain(SBTnode<Type> *node, bool flag){ 125 if(flag==false){ 126 if(node->lchild->lchild->size > node->rchild->size){ 127 node=right_rotate(node); 128 } 129 else if(node->lchild->rchild->size > node->rchild->size){ 130 node->lchild=left_rotate(node->lchild); 131 node=right_rotate(node); 132 } 133 else{ 134 return node; 135 } 136 } 137 else{ 138 if(node->rchild->rchild->size > node->lchild->size){ 139 node=left_rotate(node); 140 } 141 else if(node->rchild->lchild->size > node->lchild->size){ 142 node->rchild=right_rotate(node->rchild); 143 node=left_rotate(node); 144 } 145 else{ 146 return node; 147 } 148 } 149 //根据cqf的证明,(node->lchild,true)和(node->rchild,false)可以省略 150 node->lchild=maintain(node->lchild, false); 151 node->rchild=maintain(node->rchild, true); 152 node=maintain(node,true); 153 node=maintain(node,false); 154 return node; 155 } 156 157 //Insert函数 158 template <typename Type> 159 SBTnode<Type>* Insert(SBTnode<Type> *node, Type value){ 160 //先更新size,这会影响之后的自平衡条件 161 node->size++; 162 if(value>node->data){ 163 if(node->rchild==NIL){ 164 node->rchild=new SBTnode<Type>(value,1,node); 165 } 166 else{ 167 node->rchild=Insert(node->rchild,value); 168 } 169 } 170 else{ 171 if(node->lchild==NIL){ 172 node->lchild=new SBTnode<Type>(value,1,node); 173 } 174 else{ 175 node->lchild=Insert(node->lchild,value); 176 } 177 } 178 //插完后maintain,并返回调整后的根结点 179 return maintain(node,value>node->data); 180 } 181 182 183 template <typename Type> 184 SBTnode<Type>* SBTnode<Type>::search(Type value){ 185 if(data=http://www.mamicode.com/=value){ 186 return this; 187 } 188 else if(value>data){ 189 if(rchild==NIL){ 190 return NIL; 191 } 192 else{ 193 return rchild->search(value); 194 } 195 } 196 else{ 197 if(lchild==NIL){ 198 return NIL; 199 } 200 else{ 201 return lchild->search(value); 202 } 203 } 204 } 205 206 207 template <typename Type> 208 SBTnode<Type> *SBTnode<Type>::predecessor(){ 209 SBTnode<Type> *temp=lchild; 210 while(temp!=NIL&&temp->rchild!=NIL){ 211 temp=temp->rchild; 212 } 213 return temp; 214 } 215 216 217 template <typename Type> 218 SBTnode<Type> *SBTnode<Type>::successor(){ 219 SBTnode<Type> *temp=rchild; 220 while(temp!=NIL&&temp->lchild!=NIL){ 221 temp=temp->lchild; 222 } 223 return temp; 224 } 225 226 //remove_node func for nodes with one or no child 227 template <typename Type> 228 void SBTnode<Type>::remove_node(SBTnode<Type>* delete_node){ 229 SBTnode<Type>* temp=NIL; 230 if(delete_node->lchild!=NIL){ 231 temp=delete_node->lchild; 232 temp->father=delete_node->father; 233 //set lchild to be NIL so that its lchild won‘t be deleted later 234 delete_node->lchild=NIL; 235 } 236 if(delete_node->rchild!=NIL){ 237 temp=delete_node->rchild; 238 temp->father=delete_node->father; 239 //same as above 240 delete_node->rchild=NIL; 241 } 242 if(delete_node->father->lchild==delete_node){ 243 delete_node->father->lchild=temp; 244 } 245 else{ 246 delete_node->father->rchild=temp; 247 } 248 temp=delete_node; 249 //更新所有包含此结点的结点的size 250 //注意循环条件为temp!=NULL,因为根结点的默认father=NULL,not NIL 251 while(temp!=NULL){ 252 temp->size--; 253 temp=temp->father; 254 } 255 delete delete_node; 256 } 257 258 //remove func for any node 259 template <typename Type> 260 bool SBTnode<Type>::remove(Type value){ 261 SBTnode<Type> *delete_node, *current_node; 262 current_node=search(value); 263 if(current_node==NIL){ 264 return false; 265 } 266 if(current_node->lchild!=NIL){ 267 delete_node=current_node->predecessor(); 268 } 269 else if(current_node->rchild!=NIL){ 270 delete_node=current_node->successor(); 271 } 272 else{ 273 delete_node=current_node; 274 } 275 current_node->data=http://www.mamicode.com/delete_node->data; 276 remove_node(delete_node); 277 return true; 278 } 279 280 template <typename Type> 281 void SBT<Type>::insert(Type value){ 282 if(root==NULL){ 283 root=new SBTnode<Type>(value,1); 284 } 285 else if(root->search(value)==NIL){ 286 root=Insert(root,value); 287 } 288 } 289 290 template <typename Type> 291 bool SBT<Type>::find(Type value){ 292 if(root->search(value)==NIL){ 293 return false; 294 } 295 else{ 296 return true; 297 } 298 } 299 300 301 template <typename Type> 302 bool SBT<Type>::remove(Type value){ 303 return root->remove(value); 304 } 305 306 //求结点node在以当前结点为根结点的子树的rank 307 //从小到大排 308 template <typename Type> 309 int SBTnode<Type>::Rank(SBTnode<Type> *node){ 310 if(node->data =http://www.mamicode.com/= data){ 311 return lchild->size+1; 312 } 313 else if(node->data > data){ 314 return lchild->size+1 + rchild->Rank(node); 315 } 316 else{ 317 return lchild->Rank(node); 318 } 319 } 320 321 //for testing 322 template <typename Type> 323 void display(SBTnode<Type>* cur, int level){ 324 if(cur!=NIL){ 325 display(cur->rchild, level+1); 326 cout<<endl; 327 for(int i=0;i<level;i++){ 328 cout<<" "; 329 } 330 cout<<cur->data; 331 display(cur->lchild, level+1); 332 } 333 } 334 335 //for testing 336 template <typename Type> 337 void SBT<Type>::Display(){ 338 display(root,0); 339 } 340 341 //求值为value的结点在整棵树中的从小到大排名 342 template <typename Type> 343 int SBT<Type>::Rank(Type value){ 344 SBTnode<Type> *temp; 345 temp=root->search(value); 346 if(temp==NIL){ 347 return 0; 348 } 349 else{ 350 return root->Rank(temp); 351 } 352 } 353 354 //求当前子树中第k小的结点的data 355 template <typename Type> 356 int SBTnode<Type>::select(int k){ 357 int rank=lchild->size+1; 358 if(rank==k){ 359 return data; 360 } 361 else if(k<rank){ 362 //结点在左子树中的排名和当前子树中的排名是一样的 363 return lchild->select(k); 364 } 365 else{ 366 //右子树中会从1开始重新排 367 //所以结点在右子树中的rank+根结点的rank=结点在整棵子树中的rank 368 return rchild->select(k-rank); 369 } 370 } 371 372 //求整棵树中第k小的结点的data 373 template <typename Type> 374 int SBT<Type>::select(int k){ 375 return root->select(k); 376 }
Size Balanced Tree
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。