Python數據結構__樹

樹是一種很是重要的數據結構,它是非線性結構,它不是Python內置的數據結構;
數據結構


樹:ide

  1.非線性結構,每一個元素能夠有多個前驅和後繼;spa

  2.樹是n(n>=0)元素的集合遞歸

    n=0時,稱爲空樹it

    樹只有一個特殊的沒有前驅的元素,稱爲樹的根Rootio

    樹中除了根結點外,其他元素只能有一個前驅,能夠有零個或多個後繼class

  3.遞歸定義二叉樹

    樹T是n(n>=0)個元素的集合。n=0時,稱爲空樹。終端

    有且只有一個特殊元素根,剩餘元素均可以劃分爲m個不相交的集合T一、T二、T3...Tm,im

而每個集合都是樹,稱爲T的子樹Subtree.

    子樹也有本身的根



樹的概念


legb.jpg



結點: 樹中的數據元素

結點的度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的結點

  它是有序樹,左子樹、右子樹是順序的,不能交換次序

  即便某個結點只有一棵子樹,也要肯定它是左子樹仍是右子樹


二叉樹的五種基本形態

  空二叉樹

  只有一個根結點

  根結點只有左子樹

  根結點只有右子樹

  根結點有左子樹和右子樹



blob.png

斜樹:

  左斜樹,全部結點都只有左子樹;

  右斜樹,全部結點都只有右子樹;



滿二叉樹:

一棵二叉樹全部分支結點都存在左子樹和右子樹,而且全部葉子結點只存在在最下面一層

一樣深度二叉樹中,滿二叉樹結點最多。

k爲深度(1<=k<=n),則結點總數爲2^k-1

以下圖,一個深度爲4的15個結點的滿二叉樹

blob.png



徹底二叉樹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。

blob.png

相關文章
相關標籤/搜索