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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

平衡二叉查找树 AVL 的实现

發布時間:2024/4/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 平衡二叉查找树 AVL 的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

不同結構的二叉查找樹,查找效率有很大的不同(單支樹結構的查找效率退化成了順序查找)。如何解決這個問題呢?關鍵在于如何最大限度的減小樹的深度。正是基于這個想法,平衡二叉樹出現了。

平衡二叉樹的定義 (AVL—— 發明者為Adel’son-Vel’skii 和 Landis)

平衡二叉查找樹,又稱 AVL樹。 它除了具備二叉查找樹的基本特征之外,還具有一個非常重要的特點:它 的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的深度之差的絕對值(平衡因子 ) 不超過1。 也就是說AVL樹每個節點的平衡因子只可能是-1、0和1(左子樹高度減去右子樹高度)。

那么如何是二叉查找樹在添加數據的同時保持平衡呢?基本思想就是:當在二叉排序樹中插入一個節點時,首先檢查是否因插入而破壞了平衡,若 破壞,則找出其中的最小不平衡二叉樹,在保持二叉排序樹特性的情況下,調整最小不平衡子樹中節點之間的關系,以達 到新的平衡。所謂最小不平衡子樹 指離插入節點最近且以平衡因子的絕對值大于1的節點作為根的子樹。

平衡二叉樹的操作

  • 查找操作
    平衡二叉樹的查找基本與二叉查找樹相同。

  • 插入操作
    在平衡二叉樹中插入結點與二叉查找樹最大的不同在于要隨時保證插入后整棵二叉樹是平衡的。那么調整不平衡樹的基本方法就是: 旋轉 。 下面我們歸納一下平衡旋轉的4種情況:
    這里我們把必須重新平衡的節點叫做A。
    平衡因子:左子樹的深度減去右子樹的深度。
    相關旋轉圖示見 嚴蔚敏《數據結構》(C語言版)P235

  • 單旋轉–向右旋轉平衡處理–在A的左兒子的左子樹進行一次插入。此時平衡因子變為2。
  • 單旋轉–向左旋轉平衡處理–在A的右兒子的右子樹進行一次插入操作。此時平衡因子變為-2.
  • 雙旋轉–先右后左旋轉平衡處理–在A的左兒子的右子樹進行一次插入操作。此時平衡因子變為2.
  • 雙旋轉–先左后右平衡處理–在A的右兒子的左子樹進行一次插入操作。此時平衡因子變為-2.

代碼實現:

/***AVL 樹 插入新節點 的實現*/struct AVLNode{int val;AVLNode* left;AVLNode* right;int height;AVLNode(const int& value, AVLNode* lt, AVLNode* rt, int h = 0):val(value), left(lt),right(rt),height(h){} };/***Return thr height of node t ot -1 if NULL* / int height(AVLNode* t) const {return t == NULL ? -1 : t->height; }void insert(const int& x, AVLNode* & t) {if(t == NULL) //empty Treet = new AVLNode(x, NULL, NULL);else if(x < t->val) //插入到左兒子{//insert into left subtreeinsert(x, t->left);if(height(t->left) - height(t->right) == 2){if(x < t->left->val) //插入到了左兒子的左子樹中 ,向右單旋轉rotateWithLeftChild(t);else //插入到左兒子的右子樹, 先左后右雙旋轉doubleRotateWithLeftChild(t);}}else if(x > t->val) //插入到右兒子{insert(x, t->right);if(height(t->right) - height(t->left) == 2){if(x > t->right->val)rotateWithRightChild(t); //插入到右兒子的右子樹, 向左單旋轉else if(x < t->right->val)doubleRotateWithRightChild(t); //插入到右兒子的左子樹, 先右后左雙旋轉}}else {//待插入節點已經存在, do nothing}t->height = max(height(t->left), height(t->right)) + 1; }//向右單旋轉 void rotateWithLeftChild( AVLNode* & root) {AVLNode *newRoot = root->left;root->left = newRoot->right;newRoot->right = root;root->height = max(height(root->left), height(root->right)) + 1;newRoot->height = max(height(newRoot->left), root->height) + 1;root = newRoot; //root 指向新的root節點 }//向左單旋轉 void rotateWithRightChild(AVLNode* & root) {AVLNode* newRoot = root->right;root->right = newRoot->left;newRoot->left = root;root->height = max(height(root->left), height(root->right)) + 1;newRoot->height = max(height(newRoot->right), root->height) + 1;root = newRoot; }//先左后右雙旋轉 void doubleRotateWithLeftChild(AVLNode* & root) {rotateWithRightChild(root->left); //先對root的左子樹進行向左單旋轉rotateWithLeftChild(root); //然后對root進行向右單旋轉 }//先右后左雙旋轉 void doubleRotateWithRightChild(AVLNode* & root) {rotateWithLeftChild(root->right); //先對root的右子樹進行向右單旋轉rotateWithRightChild(root); //然后對root進行向左單旋轉 }

平衡二叉樹性能分析

平衡二叉樹的性能優勢:
很顯然,平衡二叉樹的優勢在于不會出現普通二叉查找樹的最差情況。其查找的時間復雜度為O(logN)。
在平衡樹上進行查找的過程和二叉排序樹相同,因此,在查找的過程中和給定值進行比較的關鍵字個數不超過樹的深度。
那么,
含有n個關鍵字的平衡樹的最大深度是多少呢?
為了解答這個問題,
可以借助 深度為h的平衡樹所具有的最少節點數的計算公式:
最少節點數

S(h) = S(h - 1) + S(h - 2) + 1 其中,h = 0, S(h) = 1; h = 1, S(h) = 2.

得到h的最大值。

平衡二叉樹的缺陷:
(1) 很遺憾的是,為了保證高度平衡,動態插入和刪除的代價也隨之增加。因此,我們在下一專題中講講《紅黑樹》 這種更加高效的查找結構。

(2) 所有二叉查找樹結構的查找代價都與樹高是緊密相關的,能否通過減少樹高來進一步降低查找代價呢。我們可以通過多路查找樹的結構來做到這一點,在后面專題中我們將通過《多路查找樹/B-樹/B+樹 》來介紹。

(3) 在大數據量查找環境下(比如說系統磁盤里的文件目錄,數據庫中的記錄查詢 等),所有的二叉查找樹結構(BST、AVL、RBT)都不合適。如此大規模的數據量(幾G數據),全部組織成平衡二叉樹放在內存中是不可能做到的。那么把這棵樹放在磁盤中吧。問題就來了:假如構造的平衡二叉樹深度有1W層。那么從根節點出發到葉子節點很可能就需要1W次的硬盤IO讀寫。大家都知道,硬盤的機械部件讀寫數據的速度遠遠趕不上純電子媒體的內存。 查找效率在IO讀寫過程中將會付出巨大的代價。在大規模數據查詢這樣一個實際應用背景下,平衡二叉樹的效率就很成問題了。對這一問題的解決:我們也會在《多路查找樹/B-樹/B+樹 》 將詳細分析。

上面提到的紅黑樹和多路查找樹都是屬于深度有界查找樹(depth-bounded tree —DBT)

轉載于:https://www.cnblogs.com/lanqiu5ge/p/9472203.html

總結

以上是生活随笔為你收集整理的平衡二叉查找树 AVL 的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 香蕉视频官方网站 | 成人深夜在线观看 | 成人av免费在线观看 | jizz国产视频 | 黄色大片免费观看视频 | 97人人爽人人 | 成人字幕 | 蜜乳av中文字幕 | 日韩一区二区三区电影 | 日本精品免费在线观看 | 这里只有精品在线观看 | 少妇又色又紧又黄又刺激免费 | 少妇裸体淫交视频免费看高清 | 精品久久影视 | 国产精品乱码一区 | 午夜影院污| a国产| 黄黄的视频在线观看 | 国产露脸无套对白在线播放 | 乱图区 | 久久这里只有精品首页 | 成人国产一区二区 | 欧美日韩一区二区不卡 | 亚洲乱人伦 | 欧美天天搞 | 青青草超碰在线 | 国产手机在线观看 | 色婷婷狠狠操 | 欧美极品jizzhd欧美爆 | 国产亚洲精品久久久久久打不开 | 天天操夜夜摸 | 新天堂在线 | 天天干天天操天天爱 | 男女激情视频网站 | av不卡影院 | 日韩午夜免费 | 波多野结衣 久久 | 午夜视频一区二区三区 | 国产在线不卡 | 99re这里只有精品在线 | 中文字幕一区二区三区四区视频 | 午夜高潮视频 | 久色免费视频 | 在线色播 | 视频污在线观看 | 男人天堂视频网站 | 成人毛片在线免费观看 | 黄网av | 老熟妇仑乱一区二区av | 香蕉av网站| 亚洲永久免费 | 三年大片在线观看 | 久草视频在线免费 | 绿帽视频 | 国产日韩欧美综合 | 国产对白videos麻豆高潮 | 无套内谢88av免费看 | 91美女啪啪| sao浪受的饥渴日常 91免费入口 | 97在线视频人妻无码 | 蜜臀久久精品久久久久 | 午夜免费剧场 | 亚洲成在人 | 天天爽av | 在线免费一区 | 越南毛茸茸的少妇 | 国产日韩精品一区二区三区 | 草草影院欧美 | 一区二区视频在线看 | jzzijzzij日本成熟少妇 | 国产精品性 | 99精品无码一区二区 | 九色视频91| 欧美日韩69 | 在线观看福利视频 | 成人区视频 | 免费a级片在线观看 | 欧美日韩国产黄色 | 国产成人免费在线观看 | 国产成人久久777777 | 91另类| 亚洲天堂影院在线观看 | 国产日韩av一区二区 | 亚洲欧美日韩动漫 | 日本人做受免费视频 | 黄色大全在线观看 | av一级免费| 国产精品999视频 | 亚洲国产成人精品无码区99 | 欧美涩涩涩 | 欧美日韩免费观看一区=区三区 | 对白刺激theporn| 99re在线精品视频 | 亚洲高清视频在线观看 | 成品人视频ww入口 | 亚洲va久久久噜噜噜无码久久 | 精品国产一区二区三区久久 | 成人福利免费视频 | 殴美一级黄色片 |