• <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
            @打醬油
            你這 傳說中 這個詞的運用真是爐火純青啊!!  回復  更多評論
              
            # 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!!!!!!!!!學習了!  回復  更多評論
              
            国产午夜精品久久久久九九电影| 久久青青草原精品国产软件| 麻豆亚洲AV永久无码精品久久| 性做久久久久久久| 91精品无码久久久久久五月天| 色妞色综合久久夜夜| 办公室久久精品| 久久久无码精品亚洲日韩蜜臀浪潮| 色综合久久88色综合天天| 久久精品国产精品亚洲精品| 久久精品国产精品亚洲艾草网美妙| 久久国产色AV免费看| 模特私拍国产精品久久| 国产精品久久久99| 国产人久久人人人人爽| 97精品伊人久久久大香线蕉| 无码乱码观看精品久久| 国产成人综合久久精品尤物| 波多野结衣中文字幕久久| 伊人久久无码中文字幕| 中文字幕无码久久精品青草| 欧美久久亚洲精品| 久久久久国产精品嫩草影院| 国产精品青草久久久久福利99| 久久国产高清字幕中文| 国产成人久久AV免费| 久久亚洲精品成人AV| 日韩AV无码久久一区二区| 精品综合久久久久久98| 精品久久久久久国产| 久久SE精品一区二区| 久久精品国产亚洲AV香蕉| 久久99久国产麻精品66| 久久久精品国产sm调教网站| 亚洲午夜无码久久久久| 久久精品中文字幕无码绿巨人| 国产V综合V亚洲欧美久久| 久久青青草原综合伊人| 久久精品女人天堂AV麻| 漂亮人妻被中出中文字幕久久| 影音先锋女人AV鲁色资源网久久|