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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构与算法——二叉平衡树(AVL树)详解

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

文章目錄

  • AVL樹概念
  • 不平衡概況
  • 四種平衡旋轉方式
    • RR平衡旋轉(左單旋轉)
    • LL平衡旋轉(右單旋轉)
    • RL平衡旋轉(先右后左雙旋轉)
    • LR平衡旋轉(先左后右單旋轉)
  • java代碼實現
  • 總結

AVL樹概念

前面學習二叉查找樹和二叉樹的各種遍歷,但是其查找效率不穩定(斜樹),而二叉平衡樹的用途更多。查找相比穩定很多。(歡迎關注數據結構專欄)

  • AVL樹是帶有平衡條件的二叉查找樹。這個平衡條件必須要容易保持。而且要保證它的深度是O(logN).
  • AVL的條件是左右樹的高度差(平衡因子)不大于1;并且它的每個子樹也都是平衡二叉樹。
  • 對于平衡二叉樹的最小個數,n0=0;n1=1;nk=n(k-1)+n(k-2)+1;(求法可以類比斐波那契!)

難點:AVL是一顆二叉排序樹,用什么樣的規則或者規律讓它能夠在復雜度不太高的情況下實現動態平衡呢?

不平衡概況


如果簡單的以單節點看,大致有上面四種情形,并且他們的最后結果也是有的有所相近。只是:上下會變動。該在左面的還在左面,改在右面的還在右面

這只是針對在底部,對于可能出現的平衡要首先搞清楚:

所以針對四種不平衡,可能出現在底部,也可能出現在頭,也可能出現在某個中間節點導致不平衡。 而我們只需要研究其首次不平衡點,解決之后整棵樹即繼續平衡。當然,在實際解決肯定會帶上遞歸的思想解決問題。

四種平衡旋轉方式


RR平衡旋轉(左單旋轉)


出現這種情況的原因是節點的右側的右側較深這時候不平衡節點需要左旋。再細看過程。

  • 再左旋的過程中,root(oldroot)節點下沉,中間節點(newroot)上浮.而其中中間節點(newroot)的右側依然不變。
  • 它上浮左側所以需要指向根節點(oldroot)(畢竟一棵樹)。但是這樣newroot原來左側節點H空缺。而我們需要仍然讓整個樹完整并且滿足二叉排序樹的規則
  • 而剛好本來oldroot右側指向newroot變成oldroot被newroot左側指向。所以oldroot右側空缺,剛好這個位置滿足在oldroot的右側。在newroot的左側。.所以我們將H插入在這個位置。
  • 其中H可能為NULL。不過不影響操作!

    而左旋的代碼可以表示為:
private node getRRbanlance(node oldroot) {//右右深,需要左旋// TODO Auto-generated method stubnode newroot=oldroot.right;oldroot.right=newroot.left;newroot.left=oldroot;oldroot.height=Math.max(getHeight(oldroot.left),getHeight(oldroot.right))+1;newroot.height=Math.max(getHeight(newroot.left),getHeight(newroot.right))+1;//原來的root的高度需要從新計算return newroot; }

LL平衡旋轉(右單旋轉)

而右旋和左旋相反,但是思路相同,根據上述進行替換即可!

代碼:

private node getLLbanlance(node oldroot) {//LL小,需要右旋轉// TODO Auto-generated method stubnode newroot=oldroot.left;oldroot.left=newroot.right;newroot.right=oldroot;oldroot.height=Math.max(getHeight(oldroot.left),getHeight(oldroot.right))+1;newroot.height=Math.max(getHeight(newroot.left),getHeight(newroot.right))+1;//原來的root的高度需要從新金酸 return newroot; }

RL平衡旋轉(先右后左雙旋轉)

產生不平衡的條件原因是:

  • root節點右側左側節點的深度高些,使得與左側的差大于1.這個與我們前面看到的左旋右旋不同的是因為它的結構不能直接變一下就可以完成。
  • 因為對于右左結構,中間的最大,兩側的最小。但是下面的比上面大(下面在上面右側)所以如果平衡的話,那么右左的R.L應該在中間,而R應該在右側。原來的root在左側。
  • 所以節點的變化浮動比較大,而且需要妥善處理各個子節點的移動使其滿足二叉排序樹的性質!
  • 期間考慮樹高度變化即可!

這種雙旋轉其實也很簡單。不要被外表唬住。基于前面的單旋轉,雙旋轉有兩種具體邏輯思路。
思路1:兩次旋轉RR,LL

根據上圖所圈的,先對底部使得底部的大小關系變化,使其在滿足二叉平衡樹的條件下還滿足RR結構的二叉樹。所以只需要對右節點R先進行右旋,再對ROOT進行左旋即可。
思路2:直接分析
根據初始和結果的狀態,然后分析各個節點變化順序。手動操作這些節點即可!

  • 首先根據ROOT,R,R.L三個節點變化。R.L肯定要在最頂層。左右分別指向ROOT和R。那么這其中R.left,ROOT.right發生變化(原來分別是R,L和R)暫時為空。而剛好根據左右大小關系可以補上R.L的左右節點。
  • 這樣思考整棵樹也可以完成平衡,但是要考慮樹的高度變化

    代碼為:(注釋部分為方案1)
private node getRLbanlance(node oldroot) {//右左深 // node newroot=oldroot.right.left; // oldroot.right.left=newroot.right; // newroot.right=oldroot.right; // oldroot.right=newroot.left; // newroot.left=oldroot; // oldroot.height=Math.max(getHeight(oldroot.left),getHeight(oldroot.right))+1; // newroot.right.height=Math.max(getHeight(newroot.right.left),getHeight(newroot.right.right))+1; // newroot.height=Math.max(getHeight(oldroot.left),getHeight(newroot.right))+1;//原來的root的高度需要從新金酸 oldroot.right =getLLbanlance(oldroot.right);oldroot.height=Math.max(getHeight(oldroot.left), getHeight(oldroot.right))+1;return getRRbanlance(oldroot);}

LR平衡旋轉(先左后右單旋轉)

根據上述RL修改即可

private node getLRbanlance(node oldroot) {oldroot.left =getRRbanlance(oldroot.left);oldroot.height=Math.max(getHeight(oldroot.left), getHeight(oldroot.right))+1;return getLLbanlance(oldroot);}

java代碼實現

  • 首先對于節點多個height屬性。用于計算高度(平衡因子)
  • 插入是遞歸插入。遞歸一個來回的過程,去的過程進行插入。**回的過程進行高度更新。和檢查是否平衡。**不要寫全局遞歸計算高度,效率太低下。事實上高度變化只和插入和平衡有關,仔細考慮即不會有疏漏!


總結

測試情況:

  • AVL的理解需要時間,當然筆者的AVL自己寫的可能有些疏漏,如果有問題還請各位一起探討!
  • 當然,除了插入,AVL還有刪除等其他操作,(原理相似。刪除后平衡)有興趣可以一起研究。
  • 如果需要源碼還請關注筆者公眾號:公眾號查看相關專題文章!
  • 如果對后端、爬蟲、數據結構算法等感性趣歡迎關注我的個人公眾號交流:bigsai(回復數據結構、爬蟲、java等有精心準備資料一份!)

總結

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

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

主站蜘蛛池模板: 成人片片 | 欧美日韩偷拍视频 | 国产成人欧美一区二区三区的 | 亚洲色图欧美另类 | 欧美v视频 | 琪琪五月天 | ass精品国模裸体欣赏pics | 污导航在线观看 | 永久久久久久 | 国产九九九| 一区二三区 | 精品国自产拍在线观看 | 最近中文字幕在线中文视频 | 免费在线看污片 | 超碰丝袜| 最好看的日本字幕mv视频大全 | 国产无遮挡又黄又爽免费视频 | 久久久经典| 少妇免费直播 | 天天插天天狠天天透 | 一级特黄妇女高潮2 | 欧美成人精精品一区二区频 | 木下凛凛子av一区二区三区 | 日本免费一区视频 | 亚洲一卡二卡 | 91视频网| 日本黄色大片在线观看 | 色噜噜狠狠一区二区三区牛牛影视 | 电影91久久久 | 日本乱子伦xxxx | 久久婷婷五月综合色吧 | 性做久久 | 另类视频在线观看+1080p | 少女视频的播放方法 | 亚洲高潮 | 欧美日本一区二区三区 | www黄色av | 日本美女全裸 | 欧美日韩123 | 亚洲性欧美色 | a色视频 | 久久久中文| 亚洲丝袜中文字幕 | 爆乳熟妇一区二区三区 | 无码人妻一区二区三区免费 | 国产在线激情视频 | 公肉吊粗大爽色翁浪妇视频 | 丰满少妇一区二区三区 | 欧美群交射精内射颜射潮喷 | 天堂成人网 | 2014亚洲天堂| 精品999久久久一级毛片 | 国产又大又黑又粗免费视频 | 丁五月 | 亚洲情网 | 亚洲性天堂 | 国产成人免费观看 | 91国在线观看 | 久草久操 | 日本在线色| 蜜桃91丨九色丨蝌蚪91桃色 | 国产麻豆成人传媒免费观看 | av免费看网址 | 日韩一区二区视频 | 国产一区二区91 | 亚洲欧美影院 | 中文字幕在线播放av | 99国产成人精品 | 中文文字幕一区二区三三 | 美日韩免费视频 | 97精品一区二区视频在线观看 | 天天槽 | 精品一区二区久久久久久按摩 | 91精品久久久久久久久 | 粉嫩一区| 久一精品 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 久草视频免费播放 | 丁香社区五月天 | 亚洲天堂欧美在线 | 久久免费手机视频 | 亚洲天堂va | 国产视频在线一区 | 国产又大又粗又长 | 少妇被躁爽到高潮无码文 | 不卡视频免费在线观看 | 日本高清在线一区 | 国产一区二区小说 | 夜夜操国产 | 午夜剧场欧美 | 女性生殖扒开酷刑vk | 国产国语亲子伦亲子 | 蜜桃中文字幕 | 亚洲一区二区中文 | 小镇姑娘1979版 | 婷婷伊人综合 | 高清一区二区三区 | 91成人在线免费视频 | 欧美视频在线观看免费 |