• <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 閱讀(1107) 評論(5)  編輯 收藏 引用

            評論:
            # re: Size Balanced Tree C++模板實現 2009-04-16 22:58 | 打醬油
            傳說中手寫的平衡樹?Orz...  回復  更多評論
              
            # re: Size Balanced Tree C++模板實現 2009-04-17 09:05 | Darren
            @打醬油
            你這 傳說中 這個詞的運用真是爐火純青?。。?nbsp; 回復  更多評論
              
            # 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| 久久国产精品-久久精品| 婷婷综合久久狠狠色99h| 国产精品青草久久久久福利99 | 无码AV中文字幕久久专区| 久久精品www| 无码人妻久久一区二区三区蜜桃 | 久久国产精品国产自线拍免费 | 久久九九久精品国产| 久久久久久伊人高潮影院| 久久久久久狠狠丁香| 久久天天躁狠狠躁夜夜不卡 | 久久婷婷五月综合97色| 久久99国产精品成人欧美| 欧美一区二区三区久久综合| 三级韩国一区久久二区综合| 久久国产精品99国产精| 久久精品青青草原伊人| 久久久受www免费人成| 久久国产精品99精品国产987| 久久SE精品一区二区| 人人狠狠综合久久亚洲| 99热精品久久只有精品| 国内精品伊人久久久久AV影院| 久久精品视频一| 亚洲国产精品无码久久青草| 激情五月综合综合久久69| 久久精品国产亚洲麻豆| 国产精品久久久久影院嫩草| 久久av无码专区亚洲av桃花岛| 中文成人久久久久影院免费观看| 国产精品热久久无码av| 国产—久久香蕉国产线看观看 | 91精品国产综合久久婷婷| 久久精品九九亚洲精品| 久久久精品人妻一区二区三区蜜桃| 亚洲国产精品无码久久一区二区 | 久久伊人中文无码| 亚洲精品tv久久久久久久久久| 久久伊人影视|