• <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 閱讀(1100) 評論(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!!!!!!!!!學習了!  回復  更多評論
              
            青青热久久国产久精品| 久久久久久a亚洲欧洲aⅴ| 国产成人无码精品久久久免费| 久久精品国产乱子伦| 亚洲va久久久久| 2021最新久久久视精品爱| 欧美久久亚洲精品| 大美女久久久久久j久久| 亚洲国产精品久久久久婷婷软件| 激情伊人五月天久久综合| 久久精品国产亚洲AV无码娇色 | 色播久久人人爽人人爽人人片aV| 久久综合久久综合久久综合| 国产精品久久久久久久久鸭| www亚洲欲色成人久久精品| 国产精品无码久久综合网| 亚洲精品国产成人99久久| 99久久久久| 久久亚洲sm情趣捆绑调教| 国产精品免费福利久久| Xx性欧美肥妇精品久久久久久| 久久久人妻精品无码一区| 久久久SS麻豆欧美国产日韩| 久久久久99精品成人片试看| 91精品免费久久久久久久久| 日韩va亚洲va欧美va久久| 久久青青草原精品国产| 久久精品国产精品青草| 久久五月精品中文字幕| 热re99久久6国产精品免费| 亚洲乱亚洲乱淫久久| 久久无码专区国产精品发布| 粉嫩小泬无遮挡久久久久久| 人妻精品久久久久中文字幕| 久久精品国产亚洲av麻豆小说 | 久久精品国产91久久麻豆自制 | 久久久亚洲欧洲日产国码二区 | 亚洲伊人久久精品影院| 亚洲国产精品婷婷久久| 超级碰碰碰碰97久久久久| 久久99国产精品99久久|