Size Balanced Tree

来源:互联网 发布:seo专员是做什么的 编辑:程序博客网 时间:2024/05/17 03:19

二叉查找树,定义为兄弟节点儿子的size小于等于自己的size

陈启峰的论文

 

主要内部操作是Maintain,在内部数据改变时用(删除时可以用简单删除节省时间),用于调整为新的SBT

 

一些Maintain相关代码:

  1. struct Node{
  2.     Node *lc,*rc;
  3.     Node *p;
  4.     int size,key;
  5.     Node(int,int);
  6. }NIL = Node(0,0);
  7. Node::Node(int _k,int _sz = 1){
  8.     lc = rc = p = &NIL;
  9.     key = _k;
  10.     size = _sz;
  11. }
  12. typedef Node *SB;
  13. /********************************************************
  14. SB find(SB T,int ke);
  15. //找到key为ke的节点
  16. SB find(SB T,int ke){
  17.     if( T == &NIL || T->key == ke)return T;
  18.     if( T->key > ke)return find(T->lc,ke);
  19.     else return find(T->rc,ke);
  20. }
  21. ********************************************************/
  22. void Rro(SB&T){
  23.     SB tmp = T->lc;
  24.     T->lc = tmp->rc;
  25.     tmp->rc = T;
  26. //  tmp->p = T->p ;
  27. //  T->p = tmp;
  28. //  T->lc->p = T;
  29.     
  30.     tmp->size = T->size;
  31.     T->size = T->lc->size+T->rc->size+1;T = tmp;
  32. }
  33. void Lro(SB&T){
  34.     SB tmp = T->rc;
  35.     T->rc =tmp->lc;
  36.     tmp->lc = T;
  37. //  tmp->p = T->p;
  38. //  T->p = tmp;
  39. //  T->lc->p = T;
  40.     
  41.     tmp->size = T->size;
  42.     T->size = T->lc->size+T->rc->size+1;T = tmp;
  43. }
  44. void Maintain(SB&T,bool flag){
  45.     if(flag == false){
  46.         if(T->lc->lc->size > T->rc->size){
  47.             Rro(T);
  48.         }
  49.         else if( T->lc->rc->size > T->rc->size){
  50.             Lro(T->lc);
  51.             Rro(T);
  52.         }
  53.         else return;
  54.     }
  55.     else{
  56.         if(T->rc->rc->size > T->lc->size){
  57.             Lro(T);
  58.         }
  59.         else if(T->rc->lc->size > T->lc->size){
  60.             Rro(T->rc);
  61.             Lro(T);
  62.         }
  63.         else return;
  64.     }
  65.     Maintain(T->lc,false);
  66.     Maintain(T->rc,true);
  67.     Maintain(T,false);
  68.     Maintain(T,true);
  69. }

其中bool变量flag = false 表示 T左侧子树过大

以后有机会再写

 

 

题目:二叉查找树的大部分题目,等等