日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法——图解平衡二叉树及代码实现

發布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法——图解平衡二叉树及代码实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

平衡二叉樹介紹

平衡二叉樹,是一種二叉排序樹,其中每一個節點的左子樹和右子樹的高度差最多等于1。由3位科學家共同發明,用他們首字母命名 又被稱為AVL樹。從平衡二叉樹的名稱,你也可以體會到它是一種高度平衡的二叉排序樹。我們將二叉樹上結點的左子樹深度減去右子樹的深度的值稱為平衡因子BF,那么平衡二叉樹上的所有結點的平衡因子只能是-1,0,1

平衡二叉樹的實現原理

平衡二叉樹構建的基本思想就在在構建二叉排序樹的過程中每當插入一個結點時,先檢查否是因為插入而破壞了樹的平衡性,若是,這找出最小不平衡樹,在滿足二叉排序樹的特點,將其調整成新的平衡二叉樹

旋轉圖解

在理解平衡二叉樹代碼之前,我們得理解樹的旋轉,在下面的一系列圖中,字母并無實際意義不代表其數據域,就是一個標識,但是要想著他們都是滿足二叉排序的特性,在這個特性之上進行旋轉

對樹節點進行左右旋轉

下面2圖是最基本的左右旋轉,理解后,對應的旋轉代碼就好理解了。

雙旋轉的情況

讓其左平衡,進行右旋轉,讓其右平衡進行左旋轉。T代表要旋轉的樹節點,L = T->lchild,Lr = L-rchild;R = T->rchild,Rl = R->lchild;
但是要注意下面情況:
某個樹節點T插入結點后,如果其左不平衡bf > 0,我們通過旋轉讓其左平衡。此時,其 L 左孩子的 bf 會影響如何旋轉,如果L->bf = 1 同 T 方向一致,這是最簡單的情況,只需將T進行右旋轉。右平衡也是一樣的道理。如果L->bf 和 T的方向不一致,那么就要先通過左旋轉 讓T->lchild和 T的方向一致,T在進行右旋轉。
結合代碼很好看明白。

左平衡情況




右平衡情況




實現代碼

下面主要是平衡二叉樹的插入算法,平衡二叉樹的主要算法也就是插入算法。它的刪除和查找同二叉排序樹是一樣的這里就多寫了,有興趣可以看數據結構與算法——二叉排序樹詳解以及代碼實現。

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> typedef struct BiTNode {int data;int bf;struct BiTNode* lchild, *rchild; }BiTNode, *BiTree; typedef enum{false,true}bool; //左旋轉 void L_Rotate(BiTree *T) {BiTree R = (*T)->rchild;(*T)->rchild = R->lchild;R->lchild = *T;*T = R;return; } //右旋轉 void R_Rotate(BiTree *T) {BiTree L = (*T)->lchild;(*T)->lchild = L->rchild;L->rchild = *T;*T = L;return; } #define LH +1 #define EH 0 #define RH -1 //T 的左邊高,不平衡,使其平衡,右旋轉,右旋轉前先檢查L->bf, //如果為RH,L要先進行左旋轉,使T->lchild->bf和T->bf一致 void LeftBalance(BiTree* T) {BiTree L,Lr;L = (*T)->lchild;Lr = L->rchild;switch (L->bf){case LH:L->bf = (*T)->bf = EH;R_Rotate(T);break;case RH:switch (Lr->bf){case LH:L->bf = EH;(*T)->bf = RH;break;case EH:L->bf = (*T)->bf = EH;break;case RH:L->bf = LH;(*T)->bf = EH;break;}Lr->bf = EH;L_Rotate(&L);R_Rotate(T);break;} } //T 的右邊高,不平衡,使其平衡,左旋轉,左旋轉前先檢查R->bf, //如果為LH,R要先進行右旋轉,使T->rchild->bf和T->bf一致 void RightBalance(BiTree* T) {BiTree R,Rl;R = (*T)->rchild;Rl = R->lchild;switch(R->bf){case RH:R->bf = (*T)->bf = EH;L_Rotate(T);break;case LH:switch(R->bf){case LH:R->bf = RH;(*T)->bf = EH;break;case EH:R->bf = (*T)->bf = EH;break;case RH:R->bf = EH;(*T)->bf = LH;break;}Rl->bf = EH;R_Rotate(&R);L_Rotate(T);break;} } //往平衡二叉樹上插入結點 bool InsertAVL(BiTree* T,int data,bool *taller) {if(*T == NULL) //找到插入位置{*T = (BiTree)malloc(sizeof(BiTNode)); (*T)->bf = EH;(*T)->rchild = (*T)->lchild = NULL;(*T)->data = data; *taller = true;}else{if(data == (*T)->data) //樹中有相同的結點數據直接返回{*taller = false;return false;}if(data < (*T)->data) //往左子樹搜索進行插入{if(!InsertAVL(&(*T)->lchild,data,taller)) //樹中有相同的結點{*taller = false;return false;} if (*taller){switch ((*T)->bf) //T插入結點后,檢測平衡因子,根據情況,做相應的修改和旋轉{case LH:LeftBalance(T); //插入后左邊不平衡了,讓其左平衡*taller = false;break;case EH:(*T)->bf = LH;*taller = true;break;case RH:(*T)->bf = EH;*taller = false;break;}}}else //往右子樹搜索進行插入{if(!Insert(&(*T)->rchild),data,taller) //樹中有相同的結點{*taller = false;return false;}if (*taller) //插入到右子樹中且長高了{switch ((*T)->bf) //T插入結點后,檢測平衡因子,根據情況,做相應的修改和旋轉{case LH:(*T)->bf = EH;*taller = false;break;case EH:(*T)->bf = RH;*taller = true;break;case RH:R_Balance(T); //插入后右邊不平衡了,讓其右平衡*taller = false;break;}}}}return true; }

總結

以上是生活随笔為你收集整理的数据结构与算法——图解平衡二叉树及代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产成人福利在线 | 都市激情亚洲一区 | 成人动漫免费在线观看 | 尤物在线观看 | 天堂网一区二区三区 | 综合 欧美 亚洲日本 | 精品国产九九 | 欧美一级免费看 | 日韩熟妇一区二区三区 | 国产毛片久久久久久 | 日韩欧美视频一区二区三区 | 欧美性视频一区二区 | 欧美69久成人做爰视频 | 一级黄色片国产 | 日韩欧美福利 | 成人精品毛片 | 香蕉av在线| 一本色道久久综合精品婷婷 | 亚洲香蕉在线 | 嫩草影院黄 | 蜜桃成熟时李丽珍在线观看 | 亚洲欧洲无码一区二区三区 | 中文字幕免费在线观看视频 | 亚洲情侣av | 麻豆伊甸园 | 亚洲精品一区中文字幕乱码 | 亚洲毛片在线播放 | 二区三区 | 久久激情影院 | www.夜夜夜| 亚洲啪啪| 老汉色av | 天天草天天操 | av资源在线播放 | 99国产精品白浆在线观看免费 | 国产理论在线观看 | 久久精品视频一区 | 国产精品免费在线播放 | 台湾少妇xxxx做受 | 高潮白浆女日韩av免费看 | 久操伊人| 二区国产 | 色呦呦在线观看视频 | 国产精品色在线 | 五月天综合社区 | 欧美在线视频免费观看 | 这里有精品 | 99av国产精品欲麻豆 | 最新中文字幕久久 | 好看的av在线 | 久久久久久黄 | 9i看片成人免费看片 | 一区二区播放 | a黄色片 | 亚洲狼人色| 久久99精品久久久久婷婷 | 日韩激情图片 | 国产欧美一区二区在线观看 | 亚洲国产一区在线 | 91国产免费看 | 日韩和的一区二区 | 美女毛片视频 | 在线免费黄网 | 伊人色网站 | 亚洲国产日韩在线一区 | 中文字幕欲求不满 | 97国产高清 | 欧美精品一区二区在线观看 | 粗大黑人巨茎大战欧美成人免费看 | 久久91精品国产 | 高潮一区二区三区 | 中文字幕系列 | 网红av在线 | 人人天天夜夜 | 午夜在线视频 | 无码人妻aⅴ一区二区三区69岛 | 久久手机免费视频 | 伊人久久五月 | 日韩毛片视频 | 亚洲精品色午夜无码专区日韩 | 9cao| 中文字幕99页 | 欧洲性开放大片 | 九九久久国产视频 | 免费中文字幕视频 | av一级黄色 | 99热在线观看| 国产精品老熟女视频一区二区 | 青草精品 | 日韩精品理论 | 日本免费在线播放 | 一级生活毛片 | 粉嫩av四季av绯色av | 波多野结衣福利 | 激情影音| 永久免费视频网站 | 国产自在线 | 日韩白浆| 国产视频二区 |