樹的基本概念和遍歷規則


樹的遞歸定義

樹是n(n>0)個結點的有限集,這個集合滿足下面條件:
      ⑴有且僅有一個結點沒有前驅(父親結點)。該結點稱為樹的根。
      ⑵除根外,其余的每一個結點都有且僅有一個前驅;
      ⑶除根外,每個結點都通過唯一的路徑連到根上(否則有環)。

這條路徑由根開始,而未端就在該結點上,且除根以外,路徑上的每個結點都是前一個結點的后繼(兒子結點);
由上述定義可知,樹結構沒有封閉的回路。 

節點的分類

結點一般分成三類

⑴根結點:沒有父親的結點。

在樹中有且僅有一個根結點。

如節點r
⑵分支結點:除根結點外,有孩子的結點稱為分支結點。如a,b,c,x,t,d,i
⑶葉結點:沒有孩子的結點稱為樹葉。如w,h,e,f,s,m,o,n,j,u
根結點到每個分支結點或葉結點的路徑是唯一的。
從根r到結點i的唯一路徑為rcti。




樹的度

⑴結點的度:一個結點的子樹數目稱為該結點的度。如結點i的度為3。節點t的度為2,節點b的度為1。

顯然,全部樹葉的度為0。
⑵樹的度:全部結點中最大的度稱為該樹的度(寬度)。

            下列樹的度為3。

假設採用數組存儲子節點地址的話,則應依據樹的度定義數組大小



樹的深度

 樹是分層次的。結點所在的層次是從根算起的。

根結點在第一層,根的兒子在第二層,其余各層依次類推。

即某個節點在第k層,則該節點的后件均在第k+1層。
在樹中。父結點在同一層的全部結點構成兄弟關系。


樹中最大的層次稱為樹的深度。亦稱高度。

圖中樹的深度為5。



森林

所謂森林。是指若干棵互不相交的樹的集合。

如圖去掉根結點。其原來的三棵子樹Ta,Tb,Tc的集合{Ta。Tb。Tc}就為森林。這三棵子樹的詳細形態例如以下:



有序樹和無序樹

依照樹中同層結點是否保持有序性,可將樹分為有序樹和無序樹。


    (1)假設樹中同層結點從左而右排列,其次序不容互換。這種樹稱為有序樹;
    (2)假設同層結點的次序隨意,這種樹稱為無序樹。


樹的表示方法

 ⑴自然界的樹形表示法:
用結點和邊表示樹,比如上圖採用的就是自然界的樹形表示法。樹形表示法一般用於分析問題。


長處:直觀,形象;缺點:保存困難。

⑵括號表示法:
先將根結點放入一對圓括號里,然后把它的子樹按由左而右的順序放入括號里。而對子樹也採用相同方法處理:同層子樹與它的根結點用圓括號括起來。同層子樹之間用逗號隔開,最后用閉括號括起來。比如圖可寫成例如以下形式
(A(B(E(K,L),F),C(G),D(H(M),I,J))) 
長處:易於保存;缺點:不直觀



樹的遍歷規則

所謂樹的遍歷,是指依照一定的規律不反復地訪問(或取出節點中的信息,或對節點做其它的處理)樹中的每個節點,其遍歷過程實質上是將樹這樣的非線性結構按一定規律轉化為線性結構。



先根次序遍歷
后根次序遍歷

先根次序遍歷樹

先根次序遍歷的遍歷規則為:若樹為空。則退出;否則先根訪問樹的根點,然后先根遍歷根的每棵子樹。

比如。對右圖所看到的樹進行先根次序遍歷,形成的次序為:
Rawxdhebfcstimonju

算法為:
program preorder(v:integer);
{訪問處理節點v;
for i in adj(v) do if i未訪問 then  preorder(i);
}


后根次序遍歷樹

后根次序遍歷的遍歷規則為:若樹為空,則退出;否則后根訪問每棵子樹,然后訪問根節點。比如,對右圖所看到的樹進行后根次序遍歷,形成的次序為:
whdexafbsmonijtucR

算法為:
program postorder(v:integer);
{for i in adj(v) do if i未訪問 then  postorder(i);
訪問處理節點v;
}



免責聲明!

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



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