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

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),稱這為雙旋(之所以雙旋是因?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 張書彬
請(qǐng)問(wèn)下,那個(gè)左右子樹(shù)的高怎么算的?  回復(fù)  更多評(píng)論
  

# re: 數(shù)據(jù)結(jié)構(gòu)與算法分析-AVL樹(shù) 2012-05-24 17:21 張書彬
最近在看樹(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)有寫對(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>
            午夜伦理片一区| 亚洲第一区在线观看| 亚洲国产一二三| 亚洲国产精品视频| 欧美激情一区二区三区在线视频观看| 亚洲麻豆av| 午夜亚洲性色福利视频| 亚洲福利一区| 亚洲一区二区三区欧美| 狠狠综合久久av一区二区小说| 亚洲国产毛片完整版| 国产乱人伦精品一区二区| 欧美大片在线观看一区| 国产精品国产三级国产专播精品人| 久久久久久久久久码影片| 欧美精品国产一区| 久久嫩草精品久久久精品| 欧美涩涩网站| 亚洲第一在线视频| 伊人成年综合电影网| 中国av一区| 亚洲三级国产| 欧美伊人久久久久久久久影院| 99国产精品99久久久久久| 欧美在线播放| 午夜精品理论片| 欧美精品一区二区三区在线看午夜| 久久九九99视频| 国产精品久久久久91| 91久久久在线| 在线播放中文一区| 亚洲欧美色一区| 一卡二卡3卡四卡高清精品视频| 久久嫩草精品久久久精品一 | 亚洲福利在线看| 欧美久久久久久久| 一区二区三区高清视频在线观看| 亚洲亚洲精品在线观看| 亚洲老板91色精品久久| 久久久久久穴| 另类国产ts人妖高潮视频| 国产午夜精品一区二区三区视频 | 国产一区二区三区av电影| 99精品热6080yy久久 | 久久亚洲综合色| 久久亚洲影院| 精品99一区二区| 久久精品国产一区二区三| 久久久噜噜噜久噜久久| 国产亚洲欧美日韩一区二区| 欧美在线播放一区| 麻豆久久精品| 亚洲国产综合在线| 欧美精品国产| 亚洲视屏一区| 欧美在线三级| 加勒比av一区二区| 蜜桃av综合| 亚洲欧洲一区| 亚洲一区二区三区四区在线观看| 国产精品成人av性教育| 午夜精品区一区二区三| 久久一二三四| 最新亚洲视频| 欧美日韩国语| 国产一区二区三区高清| 久久久久.com| 久久久久免费视频| 欧美成人dvd在线视频| 亚洲欧洲日产国产综合网| 欧美精品一区二区三| 一区二区三区欧美日韩| 亚洲欧美国产精品桃花| 经典三级久久| 欧美日韩一级大片网址| 亚洲专区一二三| 免费不卡在线观看| 一区二区三区高清视频在线观看| 国产欧美日韩一区二区三区在线| 久久久久久久国产| 亚洲乱亚洲高清| 久久精品久久综合| 亚洲精品色图| 欧美亚州一区二区三区| 久久久久久久999| 日韩午夜av| 久久久久这里只有精品| 99精品欧美一区二区三区综合在线 | 欧美午夜激情视频| 久久久久网站| 99在线精品观看| 久久理论片午夜琪琪电影网| 日韩天天综合| 国产一区激情| 欧美高清视频一区| 欧美日韩在线亚洲一区蜜芽| 亚洲欧美电影在线观看| 欧美成人一区二区三区在线观看 | 性做久久久久久久久| 欧美激情国产日韩精品一区18| 亚洲欧美电影院| 91久久视频| 国模大胆一区二区三区| 欧美视频在线播放| 久久人人97超碰国产公开结果| 一区二区三区欧美成人| 亚洲福利视频专区| 久久全国免费视频| 亚洲与欧洲av电影| 亚洲国产综合在线| 激情综合色丁香一区二区| 国产精品日本欧美一区二区三区| 欧美二区在线观看| 久久国内精品自在自线400部| 一区二区三区免费网站| 亚洲国产一区二区视频| 免费在线亚洲| 久久久91精品国产一区二区三区 | 欧美视频在线观看视频极品| 卡通动漫国产精品| 久久激情视频免费观看| 亚洲一区黄色| 日韩亚洲精品在线| 最新国产成人在线观看| 欧美www在线| 欧美a一区二区| 狂野欧美一区| 麻豆精品91| 久久综合狠狠综合久久激情| 久久精品国产综合精品| 久久精品二区| 久久精品国产77777蜜臀| 欧美一区二区三区喷汁尤物| 午夜视频久久久久久| 亚洲欧美日韩一区二区| 亚洲宅男天堂在线观看无病毒| 一本色道**综合亚洲精品蜜桃冫| 亚洲日韩第九十九页| 一本色道久久| 亚洲欧美另类久久久精品2019| 亚洲影院免费观看| 亚洲综合精品自拍| 性欧美超级视频| 久久av资源网站| 久久久久久一区二区| 麻豆精品精华液| 亚洲国产精品久久久久婷婷老年| 亚洲国产精品传媒在线观看| 欧美黄在线观看| 亚洲精品日韩久久| 亚洲天堂黄色| 欧美在线电影| 欧美成人伊人久久综合网| 欧美日韩a区| 国产精品嫩草99a| 国产小视频国产精品| 伊人精品成人久久综合软件| 亚洲激情成人网| 亚洲少妇在线| 欧美一区二区视频观看视频| 久久香蕉国产线看观看av| 欧美国产国产综合| 亚洲美女视频网| 欧美人成在线视频| 亚洲尤物在线视频观看| 午夜精品亚洲一区二区三区嫩草| 欧美在线视频全部完| 久久欧美中文字幕| 亚洲国产精品日韩| 亚洲愉拍自拍另类高清精品| 久久人人超碰| 欧美日韩一区二区三区免费看| 国产精品任我爽爆在线播放| 极品尤物av久久免费看| 亚洲午夜精品视频| 久久久久久久尹人综合网亚洲| 亚洲第一主播视频| 亚洲免费视频中文字幕| 久久综合久久美利坚合众国| 欧美午夜不卡视频| 精品盗摄一区二区三区| 亚洲午夜小视频| 麻豆精品在线视频| 亚洲先锋成人| 欧美暴力喷水在线| 国产欧美视频一区二区| 亚洲精品免费在线播放| 欧美综合第一页| 亚洲日韩欧美视频| 久久久xxx| 国产精品一区二区三区四区| 亚洲国产欧美日韩另类综合| 中文一区二区| 欧美成人精品在线观看| 亚洲一区二区三区在线| 裸体丰满少妇做受久久99精品| 国产精品视频第一区| 日韩一级在线| 久久一区视频| 午夜欧美大片免费观看|