成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

AVL小樹轉轉轉轉轉,我的考試掛掛掛掛掛

開發 前端
AVL 樹的意義:是二分查找樹 BST 。二分查找樹查找某個值時,時間復雜度是 O(h) ,因此,我們讓樹的盡可能平衡,即最大高度盡可能的小。因此有了 AVL 。

[[423024]]

AVL 樹的意義:是二分查找樹 BST 。二分查找樹查找某個值時,時間復雜度是 O(h) ,因此,我們讓樹的盡可能平衡,即最大高度盡可能的小。因此有了 AVL 。

參考例題:

  • AcWing:AVL樹的根[1]

百度百科[2]:在計算機科學中,AVL樹是最先發明的自平衡二叉查找樹。在AVL樹中任何節點的兩個子樹的高度最大差別為1,所以它也被稱為高度平衡樹。增加和刪除可能需要通過一次或多次樹旋轉來重新平衡這個樹。AVL樹得名于它的發明者G. M. Adelson-Velsky和E. M. Landis,他們在1962年的論文《An algorithm for the organization of information》中發表了它。

BST 本質上是維護一個有序序列,AVL 樹中的左旋右旋操作,并不會改變樹的中序遍歷結果。

上圖中把 A 右旋是怎么做的呢?把 B 旋轉到根節點,然后把 A 變成 B 的右孩子,把 E 補償給 A 作為 A 的左孩子。

左旋和右旋

對節點 u 右旋:

  • 根 u 的左兒子變成新的根 p
  • 根的左兒子變成新的根 p 原本的右兒子
  • 新的根 p 的右兒子變成了原本的根 u
  • u 和 p 的高度都需要更新
  1. void R(int& u) 
  2.     int p = l[u]; 
  3.     l[u] = r[p], r[p] = u; 
  4.     update(u), update(p); 
  5.     u = p; 

對節點 u 右旋:

  • 根 u 的右兒子變成新的根 p
  • 根的右兒子變成新的根 p 原本的左兒子
  • 新的根 p 的左兒子變成了原本的根 u
  • u 和 p 的高度都需要更新
  1. void L(int& u) 
  2.     int p = r[u]; 
  3.     r[u] = l[p], l[p] = u; 
  4.     update(u), update(p); 
  5.     u = p; 

高度更新由左右兒子決定,因為求高度時,默認其兩個兒子已經更新完高度了:

  1. void update(int u) 
  2.     h[u] = max(h[l[u]], h[r[u]]) + 1; 

插入的四種情況

四種情況

(一)新數字插到了左子樹,導致左子樹比右子樹高2;左孩子的左子樹比其右子樹高1

對于四種情況中的①。應該右旋 A 。

實例如上圖,右旋 88 即可。

(二)新數字插到了左子樹,導致左子樹比右子樹高2;左孩子的右子樹比其左子樹高1

對于四種情況中的③。應該左旋 B 再右旋 A 。

對應的情況如如下:

  1.   70 
  2. 61 
  3.   65 
  4. // 左旋 61 
  5.     70 
  6.   65 
  7. 61 
  8. // 右旋 70 
  9.   65 
  10. 61  70 

(三)新數字插到了右子樹,導致右子樹比左子樹高2;右孩子的右子樹比其左子樹高1

對于四種情況中的②。應該左旋 A 。

對應的情況如 88 96 120 ,左旋 88 即可。

(四)新數字插到了右子樹,導致右子樹比左子樹高2;右孩子的左子樹比其右子樹高1

對于四種情況中的④。應該右旋 B 再左旋 A 。

對應的情況如如下:

  1.   70 
  2. 96 
  3.   88 
  4. // 右旋 96 
  5. 70 
  6.   88 
  7.     96 
  8. // 左旋 70 
  9.   96 
  10. 70  88 

插入的代碼

  1. void insert(int& u, int w) 
  2.     if (!u) u = ++ idx, v[u] = w; 
  3.     else if (w < v[u]) 
  4.     { 
  5.         insert(l[u], w); 
  6.         if (get_balance(u) == 2) 
  7.         { 
  8.             if (get_balance(l[u]) == 1) R(u); 
  9.             else L(l[u]), R(u); 
  10.         } 
  11.     } 
  12.     else 
  13.     { 
  14.         insert(r[u], w); 
  15.         if (get_balance(u) == -2) 
  16.         { 
  17.             if (get_balance(r[u]) == -1) L(u); 
  18.             else R(r[u]), L(u); 
  19.         } 
  20.     } 
  21.  
  22.     update(u); 

參考資料

[1]AVL樹的根: https://www.acwing.com/problem/content/description/1554/

[2]百度百科: https://baike.baidu.com/item/AVL%E6%A0%91/10986648

 

責任編輯:武曉燕 來源: Piper蛋窩
相關推薦

2010-08-27 14:04:47

2010-08-27 13:49:56

2011-03-25 10:23:22

2023-11-01 07:44:29

轉轉Flutter業務

2009-08-10 16:20:13

2009-06-02 09:09:36

2010-09-14 20:02:14

2021-12-17 07:54:16

Flink SQLTable DataStream

2010-11-01 16:14:29

2016-10-21 00:03:36

2021-05-19 08:25:24

KubeEventer操作

2023-12-27 19:12:42

OLAP自助分析

2022-11-07 14:45:26

轉轉價格DDD

2009-09-17 12:55:24

2009-04-28 13:18:42

卡飯社區惡意代碼金山毒霸

2010-03-26 19:19:02

2011-06-09 13:26:27

2010-10-26 13:29:28

2011-06-09 12:50:47

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产日韩欧美综合 | 成人在线亚洲 | 一区二区三区视频在线观看 | 日本天堂视频在线观看 | 欧美一区二区三区,视频 | www久久国产 | 成人美女免费网站视频 | 视频三区 | 国产精品国产a级 | 国产欧美在线播放 | 欧美日韩中文国产一区发布 | 精品国产乱码久久久久久老虎 | 精品欧美一区二区三区 | 国产综合久久 | 国产精品久久久久久久久久了 | 先锋影音资源网站 | 人人99| a在线免费观看视频 | 久久99精品国产麻豆婷婷 | 成人一区二 | 午夜在线电影网 | 91视视频在线观看入口直接观看 | 欧洲免费视频 | 成人欧美一区二区三区在线观看 | 99在线播放| 夜夜操天天操 | www九色 | 亚洲国产精品人人爽夜夜爽 | 久久久久国产一区二区三区 | av天天爽| 中文字幕一区二区三区精彩视频 | 男女羞羞视频免费 | 狠狠操电影 | 毛片一区| 欧美国产日韩在线 | 久久精品视频一区二区 | 久久久91| 人人干人人玩 | 精品一区二区免费视频 | 日韩有码一区 | 精品九九在线 |