樹是由n個節點組成的有限集合t,其中n>=0。特別的,若n=0,稱為空樹,如果n>0則t應滿足的條件是:
1. 有乙個特定的稱為根(root)的節點,它只有直接後繼,沒有前驅。
2. 除根以外的其它節點被劃分為m個互不相交的有限集合t1,t2,...,tm,其中m>=0,每個集合又是一顆樹,並且稱為根的子樹。每棵子樹的根節點有且僅有乙個直接前驅,但可以有0個或多個直接後繼。
如上圖,子集t1=,t2=是兩個互不相交的子集,它們既為a的子樹。樹中亦包含遞迴結構,例如子樹t1中,b又是其根節點,而且除了根節點b之外的其它節點又被分為2個互不相交的子集:t11=,t12=。它們2個都是只有乙個根節點的樹,沒有子樹。
節點的度:乙個節點含有的子樹的個數稱為該節點的度;
葉節點或終端節點:度為0的節點稱為葉節點;
非終端節點或分支節點:度不為0的節點;
葉子節點:一棵樹當中沒有子結點(即度為0)的結點稱為葉子結點;
雙親節點或父節點:若乙個節點含有子節點,則這個節點稱為其子節點的父節點;
孩子節點或子節點:乙個節點含有的子樹的根節點稱為該節點的子節點;
兄弟節點:具有相同父節點的節點互稱為兄弟節點;
樹的度:一棵樹中,最大的節點的度稱為樹的度;
節點的層次:從根開始定義起,根為第1層,根的子節點為第2層,以此類推;
樹的高度或深度:樹中節點的最大層次;
堂兄弟節點:雙親在同一層的節點互為堂兄弟;
節點的祖先:從根到該節點所經分支上的所有節點;
子孫:以某節點為根的子樹中任一節點都稱為該節點的子孫。
森林:由m(m>=0)棵互不相交的樹的集合稱為森林;
資料結構中有很多樹的結構,其中包括二叉樹、二叉搜尋樹、2-3樹、紅黑樹等等。本文中對資料結構中常見的幾種樹的概念和用途進行了彙總,不求嚴格精準,但求簡單易懂。
二叉樹二叉樹是資料結構中一種重要的資料結構,也是樹表家族最為基礎的結構。
二叉樹的定義:二叉樹的每個結點至多只有二棵子樹(不存在度大於2的節點),二叉樹的子樹有左右之分,次序不能顛倒。
滿二叉樹
一顆樹深度為h,最大層數為k,深度與最大層數相同,k=h;
葉子數為2h;
第k層的結點數是:2^k-1;;
總結點數是:2^k-1,且總節點數一定是奇數。
完全二叉樹
如果乙個二叉樹與滿二叉樹前m個節點的結構相同,這樣的二叉樹被稱為完全二叉樹
二叉排序樹
任何節點的鍵值一定大於其左子樹中的每乙個節點的鍵值,並小於其右子樹中的每乙個節點的鍵值。
二叉樹排序前序、中序、後序
二叉樹排序(根節點和孩子結點,子樹是指最子的葉子結點)
前序:遍歷順序為,根節點、前序遍歷左子樹、前序遍歷右子樹;
中序:遍歷順序為,中序遍歷左子樹、根節點、中序遍歷右子樹;
後序:遍歷順序為,後序遍歷左子樹左子樹、後序遍歷左子樹右子樹、根節點
如上圖的根為a ,左子樹為(bde), 右子樹為(cf),
前序(根左右),a 再對左子樹進行前序就是(b,d,e), 再對右邊子樹就是cf
中序(左根右),左子樹為中序就是(dbe),a ,右子樹中序就是(fc)
後序(左右根),左子樹後續就是(deb),右邊子樹就是(fc) a
如上圖的根為1 ,左子樹為(24678), 右子樹為(35),
前序(根左右),1 再對左子樹進行前序就是(2,4,678,), 再對右邊子樹就是(35)
中序(左根右),左子樹為中序就是(4,768,2),1 ,右子樹中序就是(35)
後序(左右根),左子樹後續就是(786,4,2),右邊子樹就是(53) 1
b-樹
我們知道二叉查詢樹查詢的時間複雜度是o(logn),查詢速度最快和比較次數最少,既然效能已經如此優秀,
但為什麼實現索引是使用b-tree而不是二叉查詢樹,關鍵因素是磁碟io的次數, 減少磁碟io的次數就必須要壓縮樹的高度,
讓瘦高的樹盡量變成矮胖的樹,所以b-tree就在這樣偉大的時代背景下誕生了。
m階b-tree滿足以下條件:
1、每個節點最多擁有m個子樹
2、根節點至少有2個子樹
3、分支節點至少擁有m/2顆子樹(除根節點和葉子節點外都是分支節點)
4、所有葉子節點都在同一層、每個節點最多可以有m-1個key,並且以公升序排列
b+樹
b+tree是b樹的變種,有著比b樹更高的查詢效能,來看下m階b+tree特徵:
1、有m個子樹的節點包含有m個元素(b-tree中是m-1)
2、根節點和分支節點中不儲存資料,只用於索引,所有資料都儲存在葉子節點中。
3、所有分支節點和根節點都同時存在於子節點中,在子節點元素中是最大或者最小的元素。
4、葉子節點會包含所有的關鍵字,以及指向資料記錄的指標,並且葉子節點本身是根據關鍵字的大小從小到大順序鏈結。
b+tree與b-tree區別
非葉子結點的子樹指標與關鍵字個數相同;
非葉子結點的子樹指標p[i],指向關鍵字值屬於[k[i], k[i+1])的子樹(b-樹是開區間);
為所有葉子結點增加乙個鏈指標;
內節點不儲存data,只儲存key;葉子節點不儲存指標
所有關鍵字都在葉子結點出現;
為什麼資料索引用b+tree
1、更加高效的單元素查詢,與二叉樹相比可以大幅度減少io次數,與b樹相比,因為b+樹的資料都是存在葉子節點的,
所以同樣大小的磁碟頁可以容納更多的節點元素
2、葉子節點形成有順鍊錶,範圍查詢效能更優
比如查詢3到8的資料,如果是二叉樹或者b樹,io次數會遠大於b+樹
資料結構之 樹
1.雙親表示法 下標 資料 parentid 2.孩子表示法 data child1 child2 child3 3.雙親孩子表示法 下標 parentid firstchildid secondchildid 節點 下標 next 頁的話next應該是null 4.孩子兄弟表示法 data 第一次...
資料結構之樹
一 樹的基本概念 樹 tree 是元素的集合,樹有多個節點可以儲存元素 二 二叉樹 每個節點最多有兩個子節點的樹稱為二叉樹 常用來做二分查詢 binary search 等 三 b樹 即二叉搜尋樹 binary search tree 是一種特殊形態的二叉樹 1 所有節點最多擁有2個子節點 2 所有...
資料結構之樹
樹是節點的有限集合.度 a的度是3 b的度是2 d的度是2 c的度為0 當前節點的直接分支 葉子 終端節點就是葉子 e f g h c 根 非終端節點就是根 a b d 有序樹 如果e f不可以隨意換順序 就是有序樹 無序樹 如果 e f可以隨意換順序而且不影響邏輯 祖先 對e來說 b,a都是祖先 ...