Menu

算法学习记录-查找——平衡二叉树(AVL) – yule5020.com的博客 – 与非博客

0 Comment

 排序二叉树的生产率庞大地借款,显示证据。最差的显示证据是树的高价地。。在这一点上有个成绩。,将失调序列

当两叉排序树,树的建筑物是随机序列的序列依赖性很强,这将是顶点的。。

[像,图1 ]:

  这么一二叉排序树是一顶点经济状况。。敝即时显示证据,生产率松劲一棵树的高价地,我不意指或意味这种顶点的经济状况。,相反,元素更甚至。

在根的散布的两端。

技术引见人:


成绩赠送:

  有一种测度,让敝的二叉排序树不依托失调的次,它还可以使二叉排序树散布更甚至。。

引入:

  平衡二叉树(Self-Balancing Binary Search Tree 或 高价地平衡 Binary Search 树),这是一种特别的二叉排序树,每个包装

子树的左子树和右子树私下的高价地差是

  在这一点上的平衡可以从名字看出。,高价地平衡是高价地平衡。

  它摆布一棵空树,或两使分叉树具有以下优点:它的左子树和右子树都是平衡二叉树,左子树和正确的的差值的系数。

  假定平衡限定性的BF(平衡)的两叉树(平衡包装 限定性的)被清晰度为吃水减去一包装的左子树是对的,则平衡二叉树上迷住绳结的平衡限定性的只

也许是1、0、1。不同的就做错平衡二叉树。

  在下面的图1中,就做错平衡二叉树。

  看图1检查每个包装的平衡限定性的。。

[像,图2 ]:


 技术引见人:

以任何方式由 … 组成平衡二叉树?

从转变为平衡二叉树的议事顺序中可以抽象派的出转变的几个的基本经济状况:

以下是维基百科摘:

 

可以看出,调准的伪造分为两个次要,前两个是一组,下两个是一组,每一组对称美。

前两个对应于以上所述1个。 2 中经济状况,

决赛两个是对应的上图5 6 中经济状况。

以穿着一为例。,另一类对应的转动对称美。

单次左旋:与图1说得中肯经济状况对立应(左向左)

复杂摆布旋转码:(仅一次)

两旋转 对应图说得中肯3个(摆布)格

 

必要环绕一复杂旋转旋转两倍。。因为下面的行为准则,它可以成功。。

为了近便的,AVL引见竖炉(平衡限定性的)来调准树。但愿非平衡树涌现调准,驱散最不平衡。

以竖炉为例举行调准

继拔出算法,在这一点上有一重现的拔出方式。。

以上所述行为准则在电话交换机中应用。 case 它演出很庄重的角色。。领到用力打包装的顺序决定BF ca。。

嗣后添加用力打行为准则的部分地。

 技术引见人:

完好无损行为准则:

  1//  : 清晰度控制台应用顺序的使喜悦点。   2//   3  4 #include ""  5 #include 
  6  7#define LH  1
  8#define EH  0
  9#define RH -1
 10 11 typedef int dataType;  12 13 14 typedef struct BinTNode {  15    dataType data;  16int bf;  17struct BinTNode *lchd,*院舍  18 }BinTree,*pBinTree;  19 20void rotateL(pBinTree *p)  21{  22    pBinTree r;  23     r = (*p)->院舍 //r 作为一种新的根 24     P)->院舍 = r->lchd;  25     r->lchd = (*p);  26     (*p) = r;  27}  28 29void rotateR(pBinTree *p)  30{  31    pBinTree r;  32     r = P)-> LCHD //r 作为一种新的根 33 34     P)-> LCHD = r->院舍 //对附着在老R的新的根绳结的右孩子的左孩子 35     r->rchd = (*p);  36     (*p) = r;  37}  38 39void BlanceLeft(pBinTree *p)//从最小非平衡树动身 40{  41    pBinTree nR,nRchd;  42     nR = (*p)->lchd;  43switch (NRBF)  44    {  45case LH:    //在左子树中拔出新包装。 46        {  47             p)>竖炉 = EH;  48             nR->bf = EH;  49            转(P)  50break;  51        }  52case RH:    //新拔出的包装说出来源正确的的子树中。 53        {  54             nRchd = nR->院舍  55switch(nRchd->BF)//包装数NR孩子左或右的孩子吗? 56            {  57case LH://  58                {  59                     p)>竖炉 = RH;  60                     nR->bf = EH;  61break;  62                }  63case EH://  64                {  65                     p)>竖炉 = EH;  66                     nR->bf = EH;  67break;  68                }  69case RH:  70                {  71                     p)>竖炉 = EH;  72                     nR->bf = LH;  73break;  74                }  75            }  76             nRchd->bf = EH;  77             rotateL(&((*p)->隐性现象冠状动脉心脏病)  78            转(P)  79        }  80    }  81}  82void BlanceRight(pBinTree *p)//从最小非平衡树动身 83{  84    pBinTree nR,nRchd;  85     nR = (*p)->院舍  86 87switch (NRBF){  88case RH:    //在左子树中拔出新包装。 89        {  90             p)>竖炉 = EH;  91             nR->bf = EH;  92            rotateL(p);  93break;  94        }  95case LH:    //新拔出的包装说出来源正确的的子树中。 96        {  97             nRchd = nR->lchd;  98switch(nRchd->BF)//包装数NR孩子左或右的孩子吗? 99            { 100case LH:// 101                { 102                     p)>竖炉 = EH; 103                     nR->bf = RH; 104break; 105                } 106case EH:// 107                { 108                     p)>竖炉 = EH; 109                     nR->bf = EH; 110break; 111                } 112case RH: 113                { 114                     p)>竖炉 = LH; 115                     nR->bf = EH; 116break; 117                } 118            } 119             nRchd->bf = EH; 120             转(&((p)院舍) 121            rotateL(p); 122        } 123    } 124} 125126bool InsertAVL(pBinTree *T,int key,bool *高的) 127{ 128if (!*T) 129    { 130         *T = (pBinTree)malloc(sizeof(BinTree) 131         T)>消息 = key; 132         T)-> BF   = EH; 133         T)-> LCHD = NULL; 134         T)->院舍 = NULL; 135         *taller = true; 136    } 137else138    { 139if (折叶  == (*T)->消息) 140        { 141             *taller = false; 142returnfalse; 143        } 144if (折叶 < (*T)->消息) 145        { 146if (!InsertAVL(&((*T)->隐性现象冠状动脉心脏病),key,高的)) 147            { 148returnfalse; 149            } 150if (*高的) 151            { 152switch ((*T)->BF) 153                { 154case LH: 155                    { 156                        BlanceLeft(T); 157                         *taller = false; 158break; 159                    } 160case EH: 161                    { 162                         T)-> BF = LH; 163                         *taller = true; 164break; 165                    } 166case RH: 167                    { 168                         T)-> BF = EH; 169                         *taller = false; 170break; 171                    } 172                } 173174            } 175        } 176else// key > T)>消息 177        { 178if (!InsertAVL(&((*T)->院舍),key,高的)) 179            { 180returnfalse; 181            } 182if (*高的) 183            { 184switch ((*T)->BF) 185                { 186case LH: 187                    { 188                         T)-> BF = EH; 189                         *taller = false; 190break; 191                    } 192case EH: 193                    { 194                         T)-> BF = RH; 195                         *taller = true; 196break; 197                    } 198case RH: 199                    { 200                          BlanceRight(T); 201                         *taller = false; 202break; 203                    } 204                } 205206            } 207        } 208    } 209returntrue; 210} 211212213int _tmain(int argc, _TCHAR* argv[]) 214{ 215int a[10] = {2,1,0,3,4,6,7,9,8,5}; 216int i; 217bool taller; 218     pBinTree T = NULL; 219220for (i=0;i<10;i++) 221    { 222         InsertAVL(&T,一[我],&高的); 223    } 224    getchar(); 225return0; 226 }

下面的行为准则早已试验的过了。,可以应用。

引见人资料: 

发表评论

电子邮件地址不会被公开。 必填项已用*标注