平衡二叉树(AVL Tree)(左旋、右旋)
AVL Trees (Balanced binary search trees)
平衡二叉樹的定義:左右子樹深度差絕對(duì)值不能超過1。
是什么意思呢?比如左子樹的深度是2,右子樹的深度只能是1 或者3。
這個(gè)時(shí)候我們?cè)侔错樞虿迦?、2、3、4、5、6,一定是這樣,不會(huì)變成一棵“斜樹”。
那它的平衡是怎么做到的呢?怎么保證左右子樹的深度差不能超過1 呢?
https://www.cs.usfca.edu/~galles/visualization/AVLtree.html
插入1、2、3。
我們注意看:當(dāng)我們插入了1、2 之后,如果按照二叉查找樹的定義,3 肯定是要在2 的右邊的,這個(gè)時(shí)候根節(jié)點(diǎn)1 的右節(jié)點(diǎn)深度會(huì)變成2,但是左節(jié)點(diǎn)的深度是0,因?yàn)樗鼪]有子節(jié)點(diǎn),所以就會(huì)違反平衡二叉樹的定義。
那應(yīng)該怎么辦呢?因?yàn)樗怯夜?jié)點(diǎn)下面接一個(gè)右節(jié)點(diǎn),右-右型,所以這個(gè)時(shí)候我們要把2 提上去,這個(gè)操作叫做左旋。
同樣的,如果我們插入7、6、5,這個(gè)時(shí)候會(huì)變成左左型,就會(huì)發(fā)生右旋操作,把6提上去。
所以為了保持平衡,AVL 樹在插入和更新數(shù)據(jù)的時(shí)候執(zhí)行了一系列的計(jì)算和調(diào)整的操作。
平衡的問題我們解決了,那么平衡二叉樹作為索引怎么查詢數(shù)據(jù)?
在平衡二叉樹中,一個(gè)節(jié)點(diǎn),它的大小是一個(gè)固定的單位,作為索引應(yīng)該存儲(chǔ)什么內(nèi)容?
它應(yīng)該存儲(chǔ)三塊的內(nèi)容:
第一個(gè)是索引的鍵值。比如我們?cè)趇d 上面創(chuàng)建了一個(gè)索引,我在用where id =1 的條件查詢的時(shí)候就會(huì)找到索引里面的id 的這個(gè)鍵值。
第二個(gè)是數(shù)據(jù)的磁盤地址,因?yàn)樗饕淖饔镁褪侨ゲ檎覕?shù)據(jù)的存放的地址。
第三個(gè),因?yàn)槭嵌鏄?#xff0c;它必須還要有左子節(jié)點(diǎn)和右子節(jié)點(diǎn)的引用,這樣我們才能找到下一個(gè)節(jié)點(diǎn)。比如大于26 的時(shí)候,走右邊,到下一個(gè)樹的節(jié)點(diǎn),繼續(xù)判斷。
如果是這樣存儲(chǔ)數(shù)據(jù)的話,我們來看一下會(huì)有什么問題。
在分析用AVL 樹存儲(chǔ)索引數(shù)據(jù)之前,我們先來學(xué)習(xí)一下InnoDB 的邏輯存儲(chǔ)結(jié)構(gòu)。
?
總結(jié)
以上是生活随笔為你收集整理的平衡二叉树(AVL Tree)(左旋、右旋)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二叉查找树(BST Binary Sea
- 下一篇: 多路平衡查找树(B Tree)(分裂、合