二叉查找樹(BST)具備什么特性呢?
1.左子樹上所有結點的值均小於或等於它的根結點的值。
2.右子樹上所有結點的值均大於或等於它的根結點的值。
3.左、右子樹也分別為二叉排序樹。
查找結點里面的值 的方式就是二分查找的思想 查找次數就是樹的高度
二叉查找樹可以任意地構造 向一方傾斜的二叉樹是不平衡的,查詢效率就低了
平衡二叉樹(AVL Tree):
插入或刪除一個節點后,AVL樹失去平衡,AVL樹失去平衡之后,可以通過旋轉使其恢復平衡
將根節點的左或右孩子作為新根節點(左旋 右旋 多次旋)
平衡多路查找樹(B-Tree):
InnoDB存儲引擎中有頁(Page)的概念,頁是其磁盤管理的最小單位。
B-Tree結構的數據可以讓系統高效的找到數據所在的磁盤塊,InnoDB存儲引擎中默認每個頁的大小為16KB
在把磁盤數據讀入到磁盤時會以頁為基本單位,在查詢數據時如果一個頁中的每條數據都能有助於定位數據記錄的位置,
這將會減少磁盤I/O次數,提高查詢效率。
B-Tree結構的數據可以讓系統高效的找到數據所在的磁盤塊
1.每個節點最多擁有m個子樹(M階B樹的意思就是:一個根節點最多有M個子節點)
2.根節點至少有兩個子樹(M>=2(必須))
3.分支節點至少擁有m/2顆子樹(除根節點和葉子節點外的都是分支節點)
4.所有葉子節點都在同一層,每個節點最多可以有m-1個key,並且以升序排列
根據根節點找到磁盤塊 1 -》根據磁盤塊 1 的指針 P2 =》P2 指針找到磁盤塊 3 =》列表中找到關鍵字
P1磁盤塊(鍵值、指針、data值) -》P2磁盤塊(鍵值、指針、data值)
要3次磁盤I/O操作,和3次內存查找操作,按需讀取磁盤快,不是全部加載
B-Tree相對於AVLTree縮減了節點個數
每個節點中有key,也有data,而每一個頁的存儲空間是有限的,如果data數據較大時就會導致每個節點(即一個頁)
能存儲的key的數量很小
B+Tree:
B+Tree是B-Tree的加強版
B+Tree相對於B-Tree有幾點不同:
非葉子節點只存儲鍵值信息。
所有葉子節點之間都有一個鏈指針。
數據記錄都存放在葉子節點中。
B+Tree的高度一般都在2~4層
P1磁盤塊(鍵值、指針)—》葉子結點磁盤塊(鍵值、數據)
紅黑樹:
1.節點是紅色或黑色。
2.根節點是黑色。
3.每個葉子節點都是黑色的空節點(NIL節點, 最底部)。
4 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)
5.從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。
什么情況下會破壞紅黑樹的規則,什么情況下不會破壞規則呢?
比如最底部葉子節點 上一層是紅色 新添加的在紅色下面 就不符合紅黑色規則
從插入結點處開始,向上遍歷樹,並更新和修復在這個路徑上的每個結點的平衡及其平衡信息(高度)即可
新符合紅黑樹的規則,嘗試把紅色節點變為黑色,或者把黑色節點變為紅色。
左旋轉:逆時針旋轉紅黑樹的兩個節點,使得父節點被自己的右孩子取代,,而自己成為自己的左孩子
右旋轉:順時針旋轉紅黑樹的兩個節點,使得父節點被自己的左孩子取代,而自己成為自己的右孩子
