• <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!!!!!!!!!學習了!  回復  更多評論
              
            久久亚洲国产中v天仙www| 久久这里有精品视频| 久久精品国产网红主播| 99久久成人国产精品免费| 亚洲精品国产成人99久久| 久久精品国产亚洲Aⅴ香蕉| 免费一级做a爰片久久毛片潮| 国内精品久久久久影院亚洲| 97久久久精品综合88久久| 久久99精品久久久久久不卡| 三级三级久久三级久久| 国产成人无码精品久久久免费 | 99久久国产综合精品麻豆| 免费观看成人久久网免费观看| 亚洲精品无码久久久| 99久久精品午夜一区二区| 久久久久久久国产免费看| 久久久精品国产sm调教网站| 国产精品美女久久久免费| 久久婷婷激情综合色综合俺也去| 久久久久这里只有精品| 大伊人青草狠狠久久| 久久SE精品一区二区| 久久九九免费高清视频| 久久美女人爽女人爽| 午夜天堂av天堂久久久| 国内精品久久国产| 日本国产精品久久| 久久精品无码一区二区三区日韩| 精品午夜久久福利大片| 亚洲精品无码久久久影院相关影片| 理论片午午伦夜理片久久| 日韩一区二区久久久久久| 精品精品国产自在久久高清| 久久一日本道色综合久久| 日韩精品久久无码人妻中文字幕| 久久无码高潮喷水| 中文字幕乱码久久午夜| 久久久精品国产sm调教网站| 久久久久亚洲AV无码永不| 精品精品国产自在久久高清|