樹是一種很是重要的數據結構,它是非線性結構,它不是Python內置的數據結構;
數據結構
樹:ide
1.非線性結構,每一個元素能夠有多個前驅和後繼;spa
2.樹是n(n>=0)個元素的集合遞歸
n=0時,稱爲空樹;it
樹只有一個特殊的沒有前驅的元素,稱爲樹的根Root;io
樹中除了根結點外,其他元素只能有一個前驅,能夠有零個或多個後繼;class
3.遞歸定義二叉樹
樹T是n(n>=0)個元素的集合。n=0時,稱爲空樹。終端
有且只有一個特殊元素根,剩餘元素均可以劃分爲m個不相交的集合T一、T二、T3...Tm,im
而每個集合都是樹,稱爲T的子樹Subtree.
子樹也有本身的根。
樹的概念
結點: 樹中的數據元素
結點的度degree: 結點擁有的子樹的數目稱爲度,記做d(v)
葉子結點: 結點的度爲0,稱爲葉子結點leaf、終端結點、末端結點
分支結點: 結點的度不爲0,稱爲非終端結點或分支結點
分支: 結點之間的關係
內部結點: 除根結點外的分支結點,固然也不包括葉子結點
樹的度是樹內各結點的度的最大值。D結點最大爲3.樹的度數就是3.
孩子(兒子Child)結點: 結點的子樹的根結點成爲該結點的孩子
雙親(父Parent)結點: 一個結點是它各子樹的根結點的雙親
兄弟(Sibling)結點: 具備相同雙親結點的結點
祖先結點: 從根結點到該結點所經分支上全部的結點。A、B、D都是G的祖先的結點
子孫結點: 結點的全部子樹上的結點都稱爲該結點的子孫。B的子孫是D、G、H、I
結點的層次(Level): 根結點爲第一層,根的孩子爲第二層,以此類推,記做L(v)
樹的深度(高度Depth): 樹的層次的最大值。上圖的樹深度爲4
堂兄弟: 雙親在同一層的結點
有序樹: 結點的子樹是有順序的(兄弟有大小,有前後次序),不能交換
無序樹: 結點的子樹是有無序的,能夠交換
路徑: 樹中的k個結點n一、n二、...、nk,知足ni是n(i+1)的雙親,成爲n1到nk的一條路徑。就是一條線串下來的,
前一個都是後一個的父(前驅)結點。
路徑長度 = 路徑上結點數-1,也是分支數
森林:m(m>=0)棵不相交的樹的集合
對於結點而言,其子樹的集合就是森林。A結點的2棵子樹的集合就是森林。
樹的特色:
惟一的根
子樹不相交
除了根之外,每一個元素只能有一個前驅,能夠有零個或多個後繼
根結點沒有雙親結點(前驅),葉子結點沒有孩子結點(後繼)
vi是vj的雙親,則L(vi) = L(vj)-1,也就是說雙親比孩子結點的層次上1
二叉樹
每一個結點最多2棵子樹
二叉樹不存在度數大於2的結點
它是有序樹,左子樹、右子樹是順序的,不能交換次序
即便某個結點只有一棵子樹,也要肯定它是左子樹仍是右子樹
二叉樹的五種基本形態
空二叉樹
只有一個根結點
根結點只有左子樹
根結點只有右子樹
根結點有左子樹和右子樹
斜樹:
左斜樹,全部結點都只有左子樹;
右斜樹,全部結點都只有右子樹;
滿二叉樹:
一棵二叉樹的全部分支結點都存在左子樹和右子樹,而且全部葉子結點只存在在最下面一層。
一樣深度二叉樹中,滿二叉樹結點最多。
k爲深度(1<=k<=n),則結點總數爲2^k-1
以下圖,一個深度爲4的15個結點的滿二叉樹
徹底二叉樹Complete Binary Tree
若二叉樹的深度爲k,二叉樹的層數從1到k-1層的結點數都達到了最大個數,在第k層的全部結點都集中在最左邊,
這就是徹底二叉樹;
徹底二叉樹由滿二叉樹引出;
滿二叉樹必定是徹底二叉樹,但徹底二叉樹不是滿二叉樹;
k爲深度(1<=k<=n),則結點總數最大值爲2^k-1,當達到最大值的時候就是滿二叉樹;
二叉樹的性質
性質1:
在二叉樹的第i層上至多有2^(i-1)個結點(i>=1)
性質2:
深度爲k的二叉樹,至多有2^k-1個結點(k>=1)
性質3:
對於任何一棵二叉樹T,若是其終端結點數爲n0,度數爲2的結點爲n2,則有n0=n2+1
換句話說,就是葉子結點數-1就等於度數爲2的結點數;
證實:
總結點數爲n=n0+n1+n2,n1爲度數爲1的總結點總數。
一棵樹的分支數爲n-1,由於除了根結點外,其他結點都有一個分支,即n0+n1+n2-1
分支數還等於n0*0+n1*1+n2*2,n2是2分支結點因此乘以2,2*n2+n1
可得2*n2 + n1 = n0+n1+n2-1 => n2 = n0-1
其它性質:
高度爲k的二叉樹,至少有k個結點
含有n(n>=1)的結點的二叉樹高度至多爲n。和一句一個意思
含有n(n>=1)的結點的二叉樹的高度至多爲n,最小爲math.ceil(log2(n+1)),不小於對數值的最小整數,向上取整。
徹底二叉樹性質
性質1:
具備n個結點的徹底二叉樹的深度爲int(log2n)+1或者math.ceil(log2(n+1))
性質2:
若是有一棵n個結點的徹底二叉樹(深度爲性質1),結點按照層序編號,以下圖
若是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。