青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

emptysoul

  C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
  25 Posts :: 0 Stories :: 23 Comments :: 0 Trackbacks

常用鏈接

留言簿(18)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

AVL樹(shù)為二叉查找樹(shù)的變種,其定義為在二叉查找樹(shù)的基礎(chǔ)上保證所有節(jié)點(diǎn)的左子樹(shù)與右子樹(shù)的高度差最大不超過(guò)1。

         10                               10
       8     12                       8       12
     5    11 13                 5       11 13
                                    3 
     (AVL樹(shù))         (插入節(jié)點(diǎn)3后,變?yōu)槠胀ú檎叶鏄?shù),8的左右子樹(shù)高度差2)


上例為一個(gè)AVL樹(shù),10的左子樹(shù)高為3,右子樹(shù)高為虎作2,高度差為1。其子節(jié)點(diǎn)也滿足左右高度相差不超過(guò)1的定義。
如果上圖中再插入一個(gè)節(jié)點(diǎn)3,則左右子樹(shù)的高度將相差為2(不平衡),此時(shí)不符合AVL樹(shù)的定義。這時(shí)為了在插入新節(jié)點(diǎn)時(shí)仍能保持為一棵AVL樹(shù),需要在樹(shù)不平衡時(shí)對(duì)節(jié)點(diǎn)進(jìn)行旋轉(zhuǎn),所謂的旋轉(zhuǎn)即新插入新節(jié)點(diǎn)的父節(jié)點(diǎn)與其祖父節(jié)點(diǎn)進(jìn)行位置交換,旋轉(zhuǎn)后,不平衡的樹(shù)將成為一棵新的AVL樹(shù)。
對(duì)于旋轉(zhuǎn),有兩個(gè)規(guī)則:
1、若插入節(jié)點(diǎn)比其父節(jié)點(diǎn)小(插入樹(shù)左邊)或比其父節(jié)點(diǎn)大(插入樹(shù)的右邊)時(shí),只需進(jìn)行一次旋轉(zhuǎn)(右旋或左旋)。
2、若插入節(jié)點(diǎn)后使樹(shù)不平衡,并且其值處于其父節(jié)點(diǎn)及祖父節(jié)點(diǎn)之間,則需進(jìn)行兩次旋轉(zhuǎn),稱(chēng)這為雙旋(之所以雙旋是因?yàn)橐淮涡D(zhuǎn)已不能將非AVL樹(shù)轉(zhuǎn)換為AVL樹(shù),如下插入節(jié)點(diǎn)1再插入節(jié)點(diǎn)2的情況)。

           10                               
       5       12                       
     3   8  11 13                  
                                    
(插入3后,右單旋,5與8交換)      

 

此時(shí),插入節(jié)點(diǎn)1后再插入節(jié)點(diǎn)2,則3的左子樹(shù)高為2,右子樹(shù)高為0,不平衡。
根據(jù)規(guī)則2,2造成樹(shù)不平衡,并且其值處于1-3之間,需進(jìn)行一次雙旋(此時(shí)若只進(jìn)行一次單旋并不能改變10的左子樹(shù)高度),先將2與1交換,然后2與3交換。

 

           10                               
       5       12                       
     3   8  11 13                  
   1
     2                                 
(插入1后再插入2,不平衡) 

           10                               
       5       12                       
     3   8  11 13                  
   2
 1                                 
(雙旋,先進(jìn)行一次左單旋,1與2交換) 

           10                               
       5       12                       
     2   8  11 13                  
   1   3                                 
(雙旋,再進(jìn)行一次右單旋,2與3交換,樹(shù)平衡) 


AVL樹(shù)的實(shí)現(xiàn),其實(shí)現(xiàn)與查找二叉樹(shù)一致,只是在查找二叉樹(shù)的基礎(chǔ)上添加了一個(gè)高度信息。

#ifndef AVLTREE_H
#define AVLTREE_H
#include 
<iostream>
#include 
<queue>

template
<class T>
class AVLTree
{
    
//定義樹(shù)節(jié)點(diǎn),包括一個(gè)數(shù)據(jù),兩個(gè)指針,一個(gè)高度
    struct AVLNode
    {
        AVLNode(T dat, AVLNode
* l, AVLNode* r, int h=0) : data(dat), left(l), right(r), height(h){};
        T data;
        AVLNode 
*left, *right;
        
int height;
    }
* root;

    
//插入一個(gè)節(jié)點(diǎn)
    void Insert(const T& data, AVLNode*& p)
    {
        
if(p == 0)
        {
            p 
= new AVLNode(data, 00);
            std::cout 
<< data << ",";
        }
        
else if(data < p->data)
        {
            
//插入數(shù)據(jù)小于父節(jié)點(diǎn)數(shù)據(jù),插入左子樹(shù)
            Insert(data, p->left);

            
//左右子樹(shù)高度相差2,不平衡,需進(jìn)行旋轉(zhuǎn)
            if(Height(p->left) - Height(p->right) == 2)
            {
                
//插入數(shù)據(jù)比節(jié)點(diǎn)左子節(jié)點(diǎn)數(shù)據(jù)小,只需進(jìn)行一次右旋
                if(data < p->left->data)
                {
                    RightRotate(p);
                }
                
else
                {
                    
//插入數(shù)據(jù)處于節(jié)點(diǎn)與左子節(jié)點(diǎn)數(shù)據(jù)之間,需進(jìn)行一次左-右雙旋
                    LRDoubleRotate(p);
                }
            }
        }
        
else if(data > p->data)
        {
            
//插入數(shù)據(jù)小于父節(jié)點(diǎn)數(shù)據(jù),插入右子樹(shù)
            Insert(data, p->right);

            
//左右子樹(shù)高度相差2,不平衡,需進(jìn)行旋轉(zhuǎn)
            if(Height(p->right) - Height(p->left) == 2)
            {
                
//插入數(shù)據(jù)比節(jié)點(diǎn)右邊數(shù)據(jù)小,只需進(jìn)行一次左旋
                if(data > p->right->data)
                {
                    LeftRotate(p);
                }
                
else
                {
                    
//插入數(shù)據(jù)處于節(jié)點(diǎn)與節(jié)點(diǎn)右邊數(shù)據(jù)之間,需進(jìn)行一次右-左雙旋
                    RLDoubleRotate(p);
                }
            }
        }

        
p->height = MaxHeight(Height(p->left), Height(p->right)) + 1
    }

    
void RightRotate(AVLNode*& p)
    {
        AVLNode
* k = p->left;
        p
->left = k->right;
        k
->right = p;
        p
->height = MaxHeight(Height(p->left), Height(p->right)) + 1;
        k
->height = MaxHeight(Height(k->left), p->height) + 1;
        p 
= k;
    }

    
void LRDoubleRotate(AVLNode*& p)
    {
        LeftRotate(p
->left);
        RightRotate(p);
    }

    
void LeftRotate(AVLNode*& p)
    {
        AVLNode
* k = p->right;
        p
->right = k->left;
        k
->left = p;
        p
->height = MaxHeight(Height(p->left), Height(p->right)) + 1;
        k
->height = MaxHeight(Height(k->right), p->height) + 1;
        p 
= k;
    }

    
void RLDoubleRotate(AVLNode*& p)
    {
        RightRotate(p
->right);
        LeftRotate(p);
    }

    
//先序遍歷
    void PreOrder (AVLNode* p)
    {
        
if(p != 0)
        {
            Print(p);
            PreOrder (p
->left);
            PreOrder (p
->right);
        }
    }

    
//中序遍歷
    void InOrder (AVLNode* p)
    {
        
if(p != 0)
        {
            InOrder (p
->left);
            Print(p);
            InOrder (p
->right);
        }
    }

    
//后序遍歷
    void PostOrder (AVLNode* p)
    {
        
if(p != 0)
        {
            PostOrder (p
->left);
            PostOrder (p
->right);
            Print(p);
        }
    }    

    
//查找節(jié)點(diǎn)
    bool Find(const T& data, AVLNode* p)
    {
        
if(p != 0)
        {
            
if(data == p->data)
            {
                
return true;
            }
            
else if(data < p->data)
            {
                
return Find(data, p->left);
            }
            
else
            {
                
return Find(data, p->right);
            }
        }
        
else
        {
            
return false;
        }
    }

    
//刪除整棵樹(shù)
    void MakeEmpty(AVLNode* p)
    {
        
if(p != 0)
        {
            MakeEmpty(p
->left);
            MakeEmpty(p
->right);
            std::cout 
<< "del " << p->data << ",";
            delete p;
        }
    }

    
int Height(const AVLNode*& p)
    {
        
return (p == 0? -1 : p->height;
    }

    
int MaxHeight(const int& a, const int& b)
    {
        
return (a > b) ? a : b;
    }
public:
    AVLTree() : root(
0){}

    
~AVLTree()
    {
        MakeEmpty(root);
    }

    
void Insert(const T& data)
    {
        Insert(data, root);
    }

    
void PreOrder()
    {
        
//遞歸,前序遍歷
        PreOrder(root);
    }

    
void InOrder()
    {
        
//遞歸,中序遍歷
        InOrder(root);
    }

    
void PostOrder()
    {
        
//遞歸,后序遍歷
        PostOrder(root);
    }

    
//層次遍歷,使用隊(duì)列的特性實(shí)現(xiàn)樹(shù)的非遞歸遍歷
    void LevelOrder ()
    {
        queue
<AVLNode*> q;
        AVLNode
* p = root;
        
while(p)
        {
            Print(p);
            
if(p->left != 0)
            {
                q.push(p
->left);
            }
            
if(p->right != 0)
            {
                q.push(p
->right);
            }
            
if (q.empty())
            {
                
break;
            }
            p 
= q.front();
            q.pop();
        }
    }

    
//打印一個(gè)節(jié)點(diǎn)值
    void Print(AVLNode* p)
    {
        
if(p != 0)
        {
            std::cout 
<< p->data << ",";
        }
    }

    
//遞歸查找一個(gè)節(jié)點(diǎn)
    bool Find(const T& data)
    {
        
return Find(data, root);
    }
};
#endif
posted on 2008-11-25 21:27 emptysoul 閱讀(2061) 評(píng)論(3)  編輯 收藏 引用

Feedback

# re: 數(shù)據(jù)結(jié)構(gòu)與算法分析-AVL樹(shù) 2012-05-24 17:19 張書(shū)彬
請(qǐng)問(wèn)下,那個(gè)左右子樹(shù)的高怎么算的?  回復(fù)  更多評(píng)論
  

# re: 數(shù)據(jù)結(jié)構(gòu)與算法分析-AVL樹(shù) 2012-05-24 17:21 張書(shū)彬
最近在看樹(shù)形結(jié)構(gòu),還不是很了解  回復(fù)  更多評(píng)論
  

# re: 數(shù)據(jù)結(jié)構(gòu)與算法分析-AVL樹(shù)[未登錄](méi) 2012-10-19 20:54 a
LZ的右旋和左旋的程序沒(méi)有寫(xiě)對(duì)。。  回復(fù)  更多評(píng)論
  


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美在线视频a| 91久久精品一区| 欧美成人免费在线观看| 久久精品一区二区三区不卡牛牛| 亚洲欧美日韩一区二区三区在线 | 亚洲高清久久网| 久久五月婷婷丁香社区| 欧美激情亚洲| 亚洲精品日韩在线观看| 日韩午夜电影av| 日韩一区二区精品在线观看| 亚洲女女女同性video| 欧美资源在线观看| 久久人人精品| 欧美日韩精品免费观看视频| 国产精品看片你懂得| 牛夜精品久久久久久久99黑人| 欧美高清视频| 国产日产欧产精品推荐色 | 欧美久久婷婷综合色| 国产精品久久久久久久久久久久久久| 国产精品美女www爽爽爽| 好吊一区二区三区| 亚洲一区二区三区午夜| 久久人人爽爽爽人久久久| 亚洲黄色在线视频| 午夜精品久久| 欧美精品成人91久久久久久久| 欧美三级视频在线播放| 影音先锋日韩资源| 亚洲性感激情| 亚洲成人在线视频播放 | 亚洲国产美国国产综合一区二区| 日韩视频免费在线| 久久久久久穴| 国产精品护士白丝一区av| 揄拍成人国产精品视频| 午夜国产精品影院在线观看| 亚洲大胆人体视频| 香蕉久久国产| 欧美午夜片在线免费观看| 亚洲国产欧美精品| 久久激情五月激情| 在线视频一区二区| 欧美成人三级在线| 尤妮丝一区二区裸体视频| 欧美在线黄色| 亚洲午夜精品国产| 欧美四级剧情无删版影片| 久久久www成人免费精品| 一区二区三区精品久久久| 久久久久久久久一区二区| 国产精品免费区二区三区观看| 亚洲精品久久久久久久久久久久久 | 亚洲午夜精品国产| 亚洲国产婷婷综合在线精品| 久久国产福利| 国产一区二区丝袜高跟鞋图片| 午夜精品免费视频| 亚洲专区免费| 国产精品人成在线观看免费| 亚洲一区美女视频在线观看免费| 日韩一区二区免费看| 欧美日韩福利视频| 亚洲视频电影在线| 99精品视频一区二区三区| 欧美伦理在线观看| 日韩一区二区电影网| 亚洲精品资源美女情侣酒店| 欧美日韩网址| 午夜欧美理论片| 欧美一区二区视频网站| 精品电影一区| 亚洲第一二三四五区| 欧美国产91| 亚洲欧美成人网| 久久狠狠婷婷| 日韩一级欧洲| 欧美怡红院视频一区二区三区| 国内成人精品一区| 欧美激情一区二区三级高清视频| 欧美激情欧美激情在线五月| 亚洲一区二区三区影院| 久久精品青青大伊人av| 日韩亚洲欧美成人| 亚洲一区在线观看免费观看电影高清| 国产日韩av高清| 亚洲国产精品一区二区www| 欧美日韩中字| 久久久国产精品一区二区三区| 久久久亚洲综合| 一区二区三区四区国产精品| 亚洲综合欧美| 亚洲精品国产精品久久清纯直播| 99亚洲一区二区| 狠狠色噜噜狠狠色综合久| 亚洲国产日韩在线一区模特| 欧美午夜精品久久久久久久| 久久久久久久久久久久久女国产乱 | 久久国产成人| 日韩网站在线观看| 午夜精品亚洲| 亚洲精品在线视频观看| 久久激五月天综合精品| 亚洲激情视频在线观看| 国产精品女主播一区二区三区| 久久午夜色播影院免费高清| 欧美美女操人视频| 久久综合狠狠综合久久激情| 欧美日韩国产免费观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产精品美女久久久久久久| 欧美激情国产日韩| 国产亚洲欧美激情| 一区二区三区高清视频在线观看| 尤物九九久久国产精品的特点| 一区二区三区高清在线| 亚洲人成高清| 久久人人97超碰国产公开结果 | 亚洲免费视频网站| 欧美福利电影在线观看| 久久精品视频99| 欧美亚洲第一区| 亚洲国产精品久久久久| 玉米视频成人免费看| 亚洲一线二线三线久久久| 99精品视频一区| 久热成人在线视频| 久久久久99| 国产在线不卡精品| 亚洲欧美日韩国产| 性高湖久久久久久久久| 国产精品国产三级国产aⅴ9色| 亚洲欧洲一区二区三区| 亚洲国产另类久久久精品极度 | 欧美午夜女人视频在线| 亚洲欧洲免费视频| 亚洲三级免费电影| 欧美岛国激情| 亚洲黄色在线看| 日韩视频一区二区在线观看 | 国产综合色产在线精品| 午夜在线a亚洲v天堂网2018| 欧美在线观看视频| 国产视频观看一区| 小黄鸭视频精品导航| 久久久999精品免费| 国产欧美日韩一区二区三区在线观看 | 欧美成人乱码一区二区三区| 免费在线国产精品| 亚洲区一区二| 欧美日韩在线大尺度| 一区二区三区蜜桃网| 亚洲欧美成人一区二区在线电影| 国产精品乱码一区二三区小蝌蚪| 亚洲欧美在线另类| 久久精品中文字幕一区二区三区| 一色屋精品视频在线观看网站| 美女国产精品| 国产精品一区一区三区| 亚洲国产精品久久久久秋霞不卡 | 国产精品国产三级国产专播精品人| 亚洲狠狠丁香婷婷综合久久久| 一区二区三区精品久久久| 国产精品久久国产精品99gif| 一区二区日本视频| 久久精选视频| 亚洲精品乱码久久久久久久久| 欧美日韩喷水| 欧美在线精品一区| 亚洲国产日韩欧美在线图片| 亚洲一区影音先锋| 国产亚洲精品久| 欧美不卡视频一区| 亚洲一区二区在线| 欧美黄色日本| 欧美在线二区| 99国产精品视频免费观看一公开| 国产精品视频xxxx| 欧美jjzz| 久久久久久久高潮| 亚洲色无码播放| 免费观看成人鲁鲁鲁鲁鲁视频| 一区二区欧美国产| 亚洲电影第三页| 国产精品黄视频| 蜜桃视频一区| 久久精品国产亚洲一区二区三区| 亚洲乱码国产乱码精品精可以看| 美女被久久久| 久久av一区二区三区亚洲| 亚洲精品在线观| 国产一区二区三区在线观看免费视频| 欧美日本中文字幕| 老司机一区二区| 欧美亚洲三级| 亚洲性感美女99在线| 99精品欧美| 亚洲精品在线观| 亚洲欧洲精品一区二区三区波多野1战4 |