• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            #include <iostream>

            using namespace std;

            template
            <typename Type>
            struct SBNode{
                
            int   size;
                Type  key;
                SBNode
            <Type>* lchild, *rchild;
                SBNode(){}
                SBNode( SBNode
            <Type>*l, SBNode<Type>*r, int s, Type k ):
                    lchild(l), rchild(r), size(s), key(k) {}
            };

            template
            <typename Type>
            class SBTree{
                
            private:
                    SBNode
            <Type>* root;
                    SBNode
            <Type>* _null;
                    
                    
            void left_rotate ( SBNode<Type>*& root );
                    
            void right_rotate( SBNode<Type>*& root );
                    
            void maintain( SBNode<Type>*& root, bool style );
                    
            void insert( SBNode<Type>*& root, Type key );
                    
            void erase ( SBNode<Type>*& root, Type key );
                    
            void clear ( SBNode<Type>* root );
                    
            void travel( SBNode<Type>* root );
                    
                
            public:
                    SBTree ();
                    
            ~SBTree();
                    
                    
            void insert( Type key );       //  插入元素 
                    void erase ( Type key );       //  刪除元素
                    Type get_rank( int k  );       //  獲得第 k 個元素 
                    Type get_min();                //  獲得最小元素
                    Type get_max();                //  獲得最大元素
                    void clear();                  //  清空 
                    void travel();                 //  遍歷 
            };

            template
            <typename Type>
            Type SBTree
            <Type>::get_rank( int k ){
                SBNode
            <Type>* tmp= root;
                
            for( ;; ){
                    
            if( tmp->lchild->size> k ) tmp= tmp->lchild;
                    
            else if( k> tmp->lchild->size ){
                        k
            -= tmp->lchild->size+ 1;
                        tmp
            = tmp->rchild; }
                    
            else break;}
                
            return tmp->key;
            }

            template
            <typename Type>
            void SBTree<Type>::clear( SBNode<Type>* root ){
                
            if( root!= _null ){
                    clear( root
            ->lchild );
                    clear( root
            ->rchild );
                    delete root; }
            }

            template
            <typename Type>
            void SBTree<Type>::clear(){
                clear(root); delete _null; }

            template
            <typename Type>
            void SBTree<Type>::travel( SBNode<Type>* root ){
                
            if( root!= _null ){
                    travel( root
            ->lchild );
                    cout 
            << root->key << "  ";
                    travel( root
            ->rchild ); }
            }

            template
            <typename Type>
            void SBTree<Type>::travel(){
                travel( root ); }

            template
            <typename Type>
            Type SBTree
            <Type>::get_min(){
                
            if( root== _null ) return Type();
                SBNode
            <Type>* tmp= root;
                
            while( tmp->lchild!= _null ) tmp= tmp->lchild;
                
            return tmp->key;
            }

            template
            <typename Type>
            Type SBTree
            <Type>::get_max(){
                
            if( root== _null ) return Type();
                SBNode
            <Type>* tmp= root;
                
            while( tmp->rchild!= _null ) tmp= tmp->rchild;
                
            return tmp->key;
            }

            template
            <typename Type>
            void SBTree<Type>::erase( Type key ){
                erase( root, key ); }

            template
            <typename Type>
            void SBTree<Type>::erase( SBNode<Type>*& root, Type key ){
                
            if( root== _null ) return;    root->size--;
                
            if( root->key== key ){
                    SBNode
            <Type>* tmp;
                    
            if( root->lchild!= _null && root->rchild== _null ){
                        tmp
            = root;  root= tmp->lchild; delete tmp; }
                    
            else if( root->lchild== _null && root->rchild== _null ){
                        tmp
            = root; root= _null; delete tmp; }
                    
            else {
                        tmp
            = root->rchild; 
                        
            while( tmp->lchild!= _null ) tmp= tmp->lchild;
                        root
            ->key= tmp->key; erase( root->rchild, tmp->key );}
                }
                
            else if( key< root->key ) erase( root->lchild, key );
                
            else erase( root->rchild, key );
            }

            template
            <typename Type>
            void SBTree<Type>::insert( SBNode<Type>*& root, Type key ){
                
            if( root== _null ){
                 root
            = new SBNode<Type>( _null, _null, 1, key ); return; }
                root
            ->size++;
                
            if( key< root->key ) insert( root->lchild, key );
                
            else                 insert( root->rchild, key );
                maintain( root, key
            >= root->key );
            }

            template
            <typename Type>
            void SBTree<Type>::insert( Type key ){
                insert( root, key ); }

            template
            <typename Type>
            SBTree
            <Type>::SBTree(){
                _null
            = new SBNode<Type>();
                root
            = _null; 
                root
            ->lchild= root->rchild= _null;
                root
            ->size= 0;
            }

            template
            <typename Type>
            SBTree
            <Type>::~SBTree(){
                clear();
            }

            template
            <typename Type>
            void SBTree<Type>::left_rotate( SBNode<Type>*& root ){
                SBNode
            <Type>* tmp= root->rchild;
                root
            ->rchild= tmp->lchild;  tmp->lchild= root;
                tmp
            ->size= root->size;
                root
            ->size= root->lchild->size+ root->rchild->size+ 1;
                root
            = tmp;
            }

            template
            <typename Type>
            void SBTree<Type>::right_rotate( SBNode<Type>*& root ){
                SBNode
            <Type>* tmp= root->lchild;
                root
            ->lchild= tmp->rchild;  tmp->rchild= root;
                tmp
            ->size= root->size;
                root
            ->size= root->lchild->size+ root->rchild->size+ 1;
                root
            = tmp;
            }

            template
            <typename Type>
            void SBTree<Type>::maintain( SBNode<Type>*& root, bool style ){
                
            if( root== _null ) return;
                
            if!style ){
                    
            if( root->lchild->lchild->size> root->rchild->size )
                    right_rotate( root );
                    
            else if( root->lchild->rchild->size> root->rchild->size ){
                        left_rotate( root
            ->lchild );
                        right_rotate( root );
                       }
            else return;
                    }
                
            else {
                    
            if( root->rchild->rchild->size> root->lchild->size )
                    left_rotate( root );
                    
            else if( root->rchild->lchild->size> root->lchild->size ){
                        right_rotate( root
            ->rchild );
                        left_rotate( root ); 
                    }
            else return;
                }
               maintain(root
            ->lchild, false);  maintain(root->rchild, true);
               maintain(root, 
            false);          maintain(root, true);
            }
            posted on 2009-04-12 11:10 Darren 閱讀(1101) 評論(5)  編輯 收藏 引用

            評論:
            # re: Size Balanced Tree C++模板實現 2009-04-16 22:58 | 打醬油
            傳說中手寫的平衡樹?Orz...  回復  更多評論
              
            # re: Size Balanced Tree C++模板實現 2009-04-17 09:05 | Darren
            @打醬油
            你這 傳說中 這個詞的運用真是爐火純青?。?!  回復  更多評論
              
            # re: Size Balanced Tree C++模板實現 2009-04-17 13:15 | 打醬油
            @Darren
            【傳說中】就是【理論上】的意思^_^  回復  更多評論
              
            # re: Size Balanced Tree C++模板實現[未登錄] 2011-02-28 21:21 | frank
            _null->left=_null;
            _null->right=_null;
            這個得有。  回復  更多評論
              
            # re: Size Balanced Tree C++模板實現 2012-03-15 21:48 | Indeed
            ORZ!!!!!!!!!學習了!  回復  更多評論
              
            久久99精品国产99久久| AV狠狠色丁香婷婷综合久久| 精品久久久久一区二区三区| 蜜桃麻豆www久久| 思思久久99热免费精品6| 亚洲精品tv久久久久久久久| 久久夜色tv网站| 亚洲国产一成久久精品国产成人综合 | 热久久国产精品| 中文字幕无码av激情不卡久久| 无码国内精品久久人妻| 97久久综合精品久久久综合| 久久久久国产| 精品久久久久久国产91| 久久免费看黄a级毛片| 国产精品久久久久久搜索| 国产精品美女久久福利网站| 91久久婷婷国产综合精品青草| 久久天天躁狠狠躁夜夜2020| 好久久免费视频高清| 久久久久久久波多野结衣高潮| 香蕉久久夜色精品国产小说| 97久久婷婷五月综合色d啪蜜芽| 欧美综合天天夜夜久久| 色婷婷久久综合中文久久蜜桃av| 久久久久婷婷| 久久国产热这里只有精品| 色综合久久综精品| 久久99精品久久只有精品| 久久精品国产99国产精品导航| 日本加勒比久久精品| 国产一区二区精品久久凹凸| 青草影院天堂男人久久| 热99re久久国超精品首页| 久久亚洲国产欧洲精品一| 国产精品天天影视久久综合网| 久久综合香蕉国产蜜臀AV| 亚洲午夜久久久久妓女影院 | 2021国产精品久久精品| 亚洲午夜无码AV毛片久久| 久久九九久精品国产|