二叉搜尋樹 平衡二叉樹 紅黑樹 B樹 B 樹面試題

2021-10-02 16:05:15 字數 1193 閱讀 7425

二叉搜尋樹是簡單的左子樹結點小於等於它的根節點,右子樹結點值大於等於它的根結點

由於查詢效率和樹的層次有關,二叉搜尋樹可能出現都連在左邊或者右邊,退化成煉表所以需要平衡及使樹的層次最小的二叉搜尋樹,成為平衡二叉樹

但頻繁插入結點會使時間浪費在維持二叉樹平衡上,所以出現了紅黑樹。紅黑樹使盡量做到平衡,同時兼顧每次平衡的次數。

紅黑樹的調整兩種方法:變色和旋轉(左旋轉和右旋轉) 

jdk的集合類treemap和treeset底層就是紅黑樹,jdk8中,hashmap也用了紅黑樹。

b樹是一種多功能搜尋樹,它的每乙個結點都可以擁有多餘兩個孩子的結點。m路的b樹最多擁有m個孩子結點,每個結點都有資料域。常用於檔案系統

b+樹是在b樹的基礎上進行改造,它的資料都在葉子結點,同時葉子結點之間還加了指標形成鍊錶。常用於資料庫索引

為啥檔案索引要用b樹而不用二叉查詢樹或者雜湊表

如果是查詢效率(即比較次數)的話,實際上二叉樹可以說是最快的了,但是,我們的檔案索引是存放在磁碟上的,所以我們不僅要考慮查詢效率,還要考慮磁碟的定址載入次數哦,而這也是我們為什麼要用 b 樹的原因。

在把磁碟裡的資料載入到記憶體中的時候,是以頁為單位來載入的,而我們也知道,節點與節點之間的資料是不連續的,所以不同的節點,很有可能分布在不同的磁碟頁中。所以對於上面的二叉查詢樹,我們可能需要進行 4 次定址載入,而對於 b 樹,由於 b 樹的每乙個節點,可以存放多個元素,所以磁碟定址載入的次數會比較少

雜湊表雖然能夠再 o(1) 查詢到目標資料,不過如果我們要進行模糊查詢的話,卻只能遍歷所有資料,並且如果出現了極端情況,雜湊表衝突的元素太多,也會導致線性時間的查詢效率的。

為什麼b+樹在資料庫用的多(mysql底層是b+樹),不用b樹或者hash?

資料庫中select資料,不一定只選一條,b樹的話需要做區域性的中序遍歷,可能跨層訪問,而b+樹由於所有資料都在葉子節點,並且鍊錶鏈結,只要找到首尾,就能去除所有資料。資料量大的情況可能無法一次裝入記憶體,b+樹的設計可以允許資料分批

二叉查詢樹 平衡二叉樹 紅黑樹

先看幾個基本概念 樹 由根出發,指向n個孩子,孩子再指向孫子。這樣一種資料結構 二叉樹 每個接點最多有兩個孩子的樹 二叉查詢樹 每個結點的左子樹 結點 右子樹 平衡二叉樹 每個結點左右子樹的高度差不大於1 紅黑樹 從任一節點到其每個葉子的所有簡單路徑 都包含相同數目的黑色節點。當然還有其它性質 幾點...

二叉查詢樹 平衡二叉樹 紅黑樹

平衡二叉樹 首先是一棵二叉查詢樹。帶有平衡條件 每個結點的左右子樹的高度之差的絕對值 平衡因子 最多為1。紅黑樹 雖然本質上是一棵二叉查詢樹,但它在二叉查詢樹的基礎上增加了著色和相關的性質使得紅黑樹相對平衡,從而保證了紅黑樹的查詢 插入 刪除的時間複雜度最壞為o log n 還具體下列的特性 節點是...

平衡二叉樹 紅黑樹

顏色調整,第一種情況uncle存在且為紅色,第二種和第三種情況,uncle不存在 uncle存在且為黑色,先處理第三種情況,針對parent進行左單旋。test.cpp include using namespace std enum colour template struct rbtreenod...