樹的種類(數據結構)

在計算器科學中,樹(英語:tree)是一種抽象數據類型或是實現這種抽象數據類型的數據結構,用來模擬具備樹狀結構性質的數據集合。它是由n(n>0)個有限節點組成一個具備層次關係的集合。把它叫作「樹」是由於它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具備如下的特色:算法

  •     每一個節點有零個或多個子節點;
  •     沒有父節點的節點稱爲根節點;
  •     每個非根節點有且只有一個父節點;
  •     除了根節點外,每一個子節點能夠分爲多個不相交的子樹;

一、二叉樹

二叉樹:每一個節點最多含有兩個子樹的樹稱爲二叉樹。(咱們通常在書中試題中見到的樹是二叉樹)數據庫

在二叉樹的概念下又衍生出滿二叉樹和徹底二叉樹的概念數組

滿二叉樹:除最後一層無任何子節點外,每一層上的全部結點都有兩個子結點。也能夠這樣理解,除葉子結點外的全部結點均有兩個子結點。節點數達到最大值,全部葉子結點必須在同一層上。
徹底二叉樹:若設二叉樹的深度爲h,除第 h 層外,其它各層 (1~(h-1)層) 的結點數都達到最大個數,第h層全部的結點都連續集中在最左邊,這就是徹底二叉樹。網絡

 

算法實現數據結構

二叉樹:
 private static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
TreeNode(int x) { val = x; }
}性能

二叉樹的遍歷方式優化

例:spa

 圖1-1 一個二叉樹的例子指針

前序遍歷:根節點->遍歷左子樹->遍歷右子樹 blog

圖1-1中的二叉樹的前序遍歷的順序爲{10,6,4,8,14,12,17}

中序遍歷:遍歷左子樹->根節點->遍歷右子樹(能夠理解爲對根節點所在層的投影

圖1-1中的二叉樹的中序遍歷的順序爲{4,6,8,10,12,14,17}

後序遍歷:遍歷左子樹->遍歷右子樹->根節點

圖1-1中的二叉樹的中序遍歷的順序爲{4,8,6,12,17,14,10}

這3種遍歷都有遞歸和循環兩種不一樣的實現方法,每種遍歷的遞歸實現都比循環實現要更簡潔不少。

二、二叉查找樹

二叉查找樹是二叉樹的衍生概念:

二叉查找樹(英語:Binary Search Tree),也稱爲二叉搜索樹、有序二叉樹(ordered binary tree)或排序二叉樹(sorted binary tree),是指一棵空樹或者具備下列性質的二叉樹:

  •    若任意節點的左子樹不空,則左子樹上全部節點的值均小於它的根節點的值;
  •    若任意節點的右子樹不空,則右子樹上全部節點的值均大於它的根節點的值;
  •    任意節點的左、右子樹也分別爲二叉查找樹;

二叉查找樹相比於其餘數據結構的優點在於查找、插入的時間複雜度較低爲 O ( log n ) 。二叉查找樹是基礎性數據結構,用於構建更爲抽象的數據結構,如集合、多重集、關聯數組等。

三、 平衡二叉樹(AVL樹)

平衡二叉樹:當且僅當任何節點的兩棵子樹的高度差不大於1的二叉樹;

其中AVL樹是最早發明的自平衡二叉查找樹,是最原始典型的平衡二叉樹。

平衡二叉樹是基於二叉查找樹的改進。因爲在某些極端的狀況下(如在插入的序列是有序的時),二叉查找樹將退化成近似鏈或鏈,此時,其操做的時間複雜度將退化成線性的,即O(n)。因此咱們經過自平衡操做(即旋轉)構建兩個子樹高度差不超過1的平衡二叉樹。

三、紅黑樹

紅黑樹也是一種自平衡的二叉查找樹。

經過對任何一條從根到葉子的路徑上各個節點着色的方式的限制,紅黑樹確保從根到葉子節點的最長路徑不會超過最短路徑的兩倍,用非嚴格的平衡來換取增刪節點時候旋轉次數的下降,任何不平衡都會在三次旋轉以內解決

紅黑樹多用於搜索,插入,刪除操做多的狀況下

  •     每一個結點不是紅的就是黑的。
  •     根結點是黑的。
  •     每一個葉結點都是黑的。
  •     每一個紅色節點的兩個子節點都是黑色。(從每一個葉子到根的全部路徑上不能有兩個連續的紅色節點)
  •     對於任意結點而言,其到葉結點樹尾端NIL指針的每條路徑都包含相同數目的黑結點。

四、B樹

B-樹就是B樹,-只是一個符號.

B樹(B-Tree)是一種自平衡的樹,它是一種多路搜索樹(並非二叉的),可以保證數據有序。同時它還保證了在查找、插入、刪除等操做時性能都能保持在O(logn),爲大塊數據的讀寫操做作了優化,同時它也能夠用來描述外部存儲(支持對保存在磁盤或者網絡上的符號表進行外部查找)

特色:

  • 定義任意非葉子結點最多隻有M個兒子;且M>2
  • 根結點的兒子數爲[2, M]
  • 除根結點之外的非葉子結點的兒子數爲[M/2, M]
  • 每一個結點存放至少M/2-1(取上整)和至多M-1個關鍵字;(至少2個關鍵字)
  • 非葉子結點的關鍵字個數=指向兒子的指針個數-1
  • 非葉子結點的關鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1]
  • 非葉子結點的指針:P[1], P[2], …, P[M],其中P[1]指向關鍵字小於K[1]的子樹,P[M]指向關鍵字大於K[M-1]的子樹,其它P[i]指向關鍵字屬於(K[i-1], K[i])的子樹
  • 全部葉子結點位於同一層

B+樹

B+樹是B-樹的變體,也是一種多路搜索樹
B+的搜索與B-樹也基本相同,區別是B+樹只有達到葉子結點才命中(B-樹能夠在非葉子結點命中),其性能也等價於在關鍵字全集作一次二分查找;

B+的特性:

  • 全部關鍵字都出如今葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字剛好是有序的
  • 不可能在非葉子結點命中
  • 非葉子結點至關因而葉子結點的索引(稀疏索引),葉子結點至關因而存儲(關鍵字)數據的數據層
  • 更適合文件索引系統

使用場景:

文件系統和數據庫系統中經常使用的B/B+ 樹,他經過對每一個節點存儲個數的擴展,使得對連續的數據可以進行較快的定位和訪問,可以有效減小查找時間,提升存儲的空間局部性從而減小IO操做。

他普遍用於文件系統及數據庫中,如:
Windows:HPFS 文件系統
Mac:HFS,HFS+ 文件系統
Linux:ResiserFS,XFS,Ext3FS,JFS 文件系統
數據庫:ORACLE,MYSQL,SQLSERVER 等中

對比

B樹:有序數組+平衡多叉樹 B+樹:有序數組鏈表+平衡多叉樹

B+ 樹的優勢:

  1. 層級更低,IO 次數更少
  2. 每次都須要查詢到葉子節點,查詢性能穩定
  3. 葉子節點造成有序鏈表,範圍查詢方便
相關文章
相關標籤/搜索