Python入門篇-數據結構樹(tree)篇


               Python入門篇-數據結構樹(tree)篇

                                      作者:尹正傑

版權聲明:原創作品,謝絕轉載!否則將追究法律責任。

 

 

一.樹概述

1>.樹的概念

非線性結構,每個元素可以有多個前軀和后繼

樹是n(n>=0)個元素的集合:
    n = 0時,稱為空樹
    樹只有一個特殊的沒有前驅的元素,稱為樹的根root
    樹中除了根結點外,其余元素只能有一個前驅,可以有零個或者多個后繼

遞歸定義:
    數T是n(n>=0)個元素的集合。n=0時,稱為空樹
    有且只有一個特殊元素根,剩余元素都可以被划分為m個互不相交的集合T1,T2,T3,...,Tm,而每一個集合都是樹,稱為T的子樹subtree
    子樹也有自己的根

2>.數的相關術語

結點:
  樹中的數據元素。 結點的度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,n3,...,nk,滿足ni是n(i+1)的雙親,稱為n1到nk的一條路徑。就是一條線串下來的,前一個都是后一個的父(前驅)結點。

路徑的長度
  路徑的長度 = 路徑上結點點數 -1,也是分支數。

森林:
  m(m>=0)棵不想交的樹的集合。對於節點而言,其子樹的結合就是森林。A節點的2棵子樹的集合就是森林。

3>.數的特點

    (1)唯一的根
    (2)子樹不相交
    (3)除了根以外,每個元素只能有一個前驅,可以有零個或多個后繼
    (4)根結點沒有雙親結點(前驅),葉子結點沒有孩子結點(后繼)
    (5)vi是vj的雙親,則L(vi)=L(vj)-1,也就是說雙親比孩子結點的層次小1

 

二.樹的分類

1>.二叉樹

(1)每個結點最多2棵子樹
    二叉樹不存在度數大於2的結點。

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

(3)即使某個節點只有一棵子樹,也要確定它是左子樹還是右子樹

(4)二叉樹的物種基本形態
    1)空二叉樹
    2)只有一個根結點
    3)根結點只有左子樹
    4)根結點只有右子樹
    5)根結點有左子樹和右子樹

 

2>.斜樹

左斜樹
  所有節點都只有左子樹

右斜樹
  所有節點都只有右子樹

3>.滿二叉樹

(1)一顆二叉樹的所有分支結點都存在左子樹和右子樹,並且所有子節點只存在在最下面一層。

(2)同樣深度二叉樹中,滿二叉樹結點最多。

(3)K為深度(1<=k<=n),則節點總數為2^k-1

如下圖,一個深度為4的15個節點的滿二叉樹

4>.完全Complete Binary Tree

若二叉樹的深度為k,二叉樹的層數從1到k-1層的節點數都達到了最大個數,在第k層的所有節點都集中在最左邊,這就是完全二叉樹。

完全二叉樹由滿二叉樹引出。

滿二叉樹一定是完全二叉樹,但完全二叉樹不是滿二叉樹。

k為深度(1<=k<=n),則結點總數最大值為2^k-1,當達到最大值的時候就是滿二叉樹。

如下圖所示,完全二叉樹,最下一層的葉子結點都連續的集中在左邊

 

 

三.二叉樹性質

1>.性質1

  在二叉樹的第i層上最多有2^(i-1)個節點(i>=1)\

2>.性質2

  深度為k的二叉樹,至多有2^k-1個結點(k>=1)
  一層:2 - 1 = 1
  二層:4 - 1 = 1 + 2 =3
  三層:8 - 1 = 1 + 2 + 4 = 7

3>.性質3

    對任何一棵二叉樹T,如果其終結結點數為n0,度數為2的節點為n2,則有n0 = n2 + 1.
  換句話說,就是葉子結點數-1就等於度數為2的結點數。
  證明:
    (1)總結點數為n = n0 + n1 + n2,n1位度數為1的節點總數。
    (2)一棵樹的分支為n-1,因為除了根結點外,其余結點都有一個分支,即n0 + n2 + n3 -1.
    (3)分支數還等於n0*0 + n1*1 +n2*2,n2是2分支結點所以乘以2,2*n2 + n1.
    (4)可得2*n2 + n1 = n0 + n1 + n2 -1 => n2 = n0 -1

4>.性質4

  具有n個結點的完全二叉樹的深度為int(log2n)+1或者math.ceil(log2(n+1))

5>.性質5

  (1)如果有一棵n個結點的完全二叉樹(深度為性質4),按照節點層次編號,如下圖所示。
  (2)如果i=1,則節點i是二叉樹的根,無雙親;如果i>1,則其雙親是int(i/2),向下取整。就是子結點的編號整除2得到的就是父節點的編號。父結點如果是i,那么左孩子結點就是2i,右孩子結點就是2i+1.
  (3)如果2i>n,則節點i無左孩子,即結點i為葉子結點;否則其左孩子結點存在編號為2i。
  (4)如果2i+1>n,則結點i無右孩子,注意這里並不能說明結點i沒有左孩子;否則右孩子節點存在編號為2i+1。

6>.其他性質

  (1)高度為k的二叉樹,至少有k個結點。
  (2)含有n(n>=1)的結點的二叉樹高度至多為n。
  (3)含有n(n>=1)的結點的二叉樹的高度至多為n,最少為math.ceil(log2(n+1)),不小於對數值的最小整數,向上取整。
  (4)假設高度為h,2^h-1=n => h = log2(n+1),層次數是取整。如果是8個節點,3.1699就要向上取整為4,為4層。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM