Python數據結構__樹

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


樹:

  1.非線性結構,每個元素可以有多個前驅和後繼;

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

    n=0時,稱爲空樹

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

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

  3.遞歸定義

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

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

而每一個集合都是樹,稱爲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個結點n1、n2、...、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)

    

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章