[toc]數據結構
1 樹
樹在數據結構中屬於一種非線性結構,每一個元素能夠有多個前驅和後繼,它有以下定義:
樹是n(n≥0)個元素的集合:spa
- n = 0 時,成爲空樹
- 樹只有一個特殊的沒有前驅的元素,稱爲數的根Root
- 樹中除了根節點外,其他元素只能有一個前驅,能夠有零個或者多個後繼
遞歸定義:3d
- 樹T是n(n≥0)個元素的集合。n = 0 時,成爲空樹
- 有且只有一個特殊元素根,剩餘元素均可以被劃分爲m個互不相交的集合T1,T2,...,Tm,而每個集合都是樹,成爲T的子樹Subtree
- 子樹也有本身的根
2 樹的概念
樹是一箇中很是抽象的概念,下面主要介紹樹中各類名詞的含義:code
名稱 |
含義 |
節點 |
數中的數據元素 |
數的度 |
樹內各節點的度的最大值 |
節點的度(degree) |
節點擁有的子樹的數目成爲度,記做d(v) |
葉子節點 |
節點的度數爲0,成爲葉子節點leaf、終端節點、末端節點 |
分支節點 |
節點度數不爲0,成爲非終端節點或分支節點 |
分支 |
節點之間的關係 |
內部節點 |
除根節點外的分支節點,固然也不包括葉子節點 |
孩子(兒子Child)節點 |
節點的子樹的根節點成爲該節點的孩子 |
雙親(父Parent)節點 |
一個節點是它各個樹的根節點的雙親 |
兄弟(Sibling)節點 |
具備相同雙親節點的節點 |
祖先節點 |
從根節點到該節點所經分支上全部的節點。 |
子孫節點 |
節點的全部子樹上的節點都成爲該節點的子孫。 |
節點的層次(Level) |
根節點爲第一層,根的孩子爲第二層,依次類推記做(Lv) |
樹的深度(高度Depth) |
樹的層次的最大值 |
堂兄弟 |
雙親在同一層的節點 |
有序樹 |
結點的子樹是有順序的(兄弟有大小,有前後次序),不能交換 |
無序數 |
結點的子樹是無序的,能夠交換 |
路徑 |
樹中的k個節點n一、n二、...nk,知足ni是n(i+1)的雙親,成爲n1到nk的一條路徑。就是一條線串下來的,前一個都是後一個父(前驅)節點。 |
森林 |
m(m≥0)課不相交的樹的集合,對於節點而言,其子樹的集合就是森林。 |
3 樹的特色
下面咱們來總結一下書的特色:blog
- 惟一的根
- 子樹不相交
- 除了根之外,每一個元素只能有一個前驅,能夠有零個或多個後繼
- 根節點沒有雙親節點(前驅),葉子節點沒有孩子節點(後繼)
- vi是vj的雙親,則L(vi) = L(vj) - 1 ,也就是說雙親比孩子節點的層次小1
堂兄弟的雙親是兄弟關係嗎?遞歸
- 堂兄弟定義是:雙親節點在同一層的節點
- 右圖G和J是堂兄弟,由於它們的雙親節點D和E在第三層,依然是堂兄弟
- 所以,堂兄弟的雙親不必定是兄弟關係
4 二叉樹
二叉樹是一種特別的數,它有以下特色:hash
- 每一個節點最多2課子樹,即二叉樹不存在度數大於2的節點
- 它是有序樹、左子樹、右子樹是順序的,不能交換次序
- 即便某一個節點只有一顆子樹,也要肯定它是左子樹仍是右子樹
二叉樹的五種基本形態:table
- 空二叉樹
- 只有一個根節點
- 根節點只有左子樹
- 根節點只有右子樹
- 根節點有左子樹和右子樹
4.1 斜樹
分爲左斜樹和右斜樹:二叉樹
- 左斜樹:全部節點都只有左子樹
- 右斜樹:全部節點都只有右子樹
4.2 滿二叉樹
滿二叉樹有以下特色:終端
- 一課二叉樹的全部分支結構都存在左子樹和右子樹,而且全部葉子節點只存在在最下面一層。
- 一樣深度二叉樹中,滿二叉樹的節點最多
- K爲深度(1≤k≤n),則節點總數爲2^k - 1
- 下面是一個深度爲4的15個節點的滿二叉樹
4.3 徹底二叉樹
徹底二叉樹的特色:
- 若二叉樹的深度爲k,二叉樹的層數從1到k-1層的節點數都達到了最大個數,在第k層的全部節點都集中在最左邊,這就是徹底二叉樹
- 徹底二叉數由滿二叉樹引出
- 滿二叉樹必定是徹底二叉樹,但徹底二叉樹不是滿二叉樹
- k爲深度(1≤k≤n),則節點總數的最大值爲2^k - 1,當達到最大值的時候就是滿二叉樹
- 下面是一個深度爲4的徹底二叉樹
注意:徹底二叉樹K層節點都靠左排列,不然不能稱爲徹底二叉樹
4.4 二叉樹的性質
下面列舉一些二叉樹的特性,
4.4.1 性質1
在二叉樹的第i層上至多有2^(i-1)個節點(i≥1)
以上圖爲例當i等於4時,那麼第4層最多含有2^(4-1),也就是8個元素
4.4.2 性質2
深度爲k的二叉樹,至多有2^k - 1 個節點(k≥1)
4.4.3 性質3
對任何一顆二叉樹T,若是其終端節點爲n0,度數爲2的節點爲n2,則有n0 = n2 + 1。換一句話說,就是葉子節點數-1就等於度數爲2的節點數
證實:
- 總結點數爲n=n0+n1+n2,n1是度數爲1的節點總數。
- 一棵樹的分支節點爲n-1,由於除了根節點外,其他節點都有一個分支,即n0+n1+n2-1
- 分支數還等於n00+n11+n22,n2是2分支節點因此乘以2,2m2+n1
- 可得2*n2+n1=N0+n1+n2-1 ==> n2=n0-1
4.4.4 性質4
具備n個節點的徹底二叉樹的深度爲int(log2n) + 1 或者math.ceil(log2(n+1))
4.4.5 性質5
若是有一顆n個節點的徹底二叉樹(深度爲性質4)
- 若是i=1,則節點i是二叉樹的根,無雙親;若是i>1,則其雙親是int(i/2),向下取整。就是子節點的編號整出2獲得的就是父結點的編號。父節點若是是i,那麼左孩子爲2i,右孩子節點就是2i+1。
- 若是2i>n,則節點i無左孩子,即節點i爲葉子節點;不然其左孩子節點存在編號爲2i。
- 若是2i+1>n,則節點i無右孩子,注意這裏並不能說明節點i沒有左孩子;不然右孩子節點存在編號爲2i+1.
4.4.6 其餘性質
- 高度爲k的二叉樹,至少有k個節點。
- 含有n(n≥1)的節點的二叉樹高度至多爲n。
- 含有n(n≥1)的節點的二叉樹的高度至多爲n,最小爲math(log2(n+1)),不小於對整數值的最小整數,向上取整。
- 假設告訴爲h, 2^h-1=n ==> h=log2(n+1),層數是取整。若是是8個節點,3.1699就要向上取整爲4,即4層