1:什麼是樹:
是n(n>=0)個結點的有限集。n=0的時候稱為空樹
在任意一棵非空樹種:
(1)有且僅有乙個特定的稱為根(root)的結點
(2)當n>1時,其餘節點可分為m(m>0)個互不相交的有限集,t1 t2…..其中每個集合本身又是一棵樹,稱為根的子樹
2:結點的度:
結點擁有的子樹稱為結點的度
結點的層次(level)從根開始定義起,根為第一層,根的的孩子為第二層,若某個結點在第i層,則其子樹的根就在第i+1層。其中樹的結點的最大層次稱為樹的深度(depth)或高度。
如下圖深度為4
樹的一些基本術語:
1:樹的結點:由乙個資料元素和若干個指向其子樹的分支組成。
2:結點的度:結點所擁有的子樹的個數(即分支數)稱為該結點的度。
3:葉子結點:度為0的結點稱為葉子結點,或者稱為終端結點。
4:分支結點:度不為0的結點稱為分支結點,或者稱為非終端結點。一棵樹的結點由葉子結點和分支結點組成。
5:孩子、雙親、兄弟:樹中乙個結點的子樹的根結點稱為這個結點的孩子;這個結點稱為它孩子結點的雙親;具有同乙個雙親的孩子結點互稱為兄弟。
6:路徑、路徑長度:如果一棵樹的一串結點n1,n2,…,nk有如下關係:結點ni是ni+1的父結點(i為1~k,不等於k的值),就把n1,n2,…,nk稱為一條由n1至nk的路徑。路徑長度是指路徑上經過的邊的數量,所以這條路徑的長度是k-1。
7:祖先、子孫:在樹中,如果有一條路徑從結點m到結點n,那麼m就稱為n的祖先,而n稱為m的子孫。
8:結點的層數:規定樹的根結點的層數為1,其餘結點的層數等於它雙親結點的層數加1。
9:樹的深度(高度):樹中所有結點中的最大層數稱為樹的深度。
10:樹的度:樹中各結點中度的最大值稱為該樹的度。
11:有序樹、無序樹:如果一棵樹中結點的各子樹從左到右都是有次序的,不能交換的,稱這棵樹為有序樹;反之為無序樹。
12:森林:m(m>=0)棵互不相交的樹的集合。
13:同構:對於兩棵樹,若通過對各結點適當重新命名,就可以使這兩棵樹完全相等(結點對應相等,結點關係也相等),稱這兩棵樹同構。
14:層序編號:將書中結點按照從上層到下層、同層從左到右的次序依次給它們編號1開始的自然數。
樹的三種表示方式
雙親表示法
缺點:找父(爹)容易找子節點(兒子)麻煩
孩子表示法:
方案一:
缺點:
找子節點(兒子)容易,找(父結點)爹難;
陣列大小不好確定,建立多了浪費空間,少了又存不下
方案二:比上面多了乙個資料域,根據它的大小來動態分配指標域,雖然解決了空間問題『
但是還是沒有辦法解決,找父節點困難問題。
最終方案:(雜湊鍊錶)
把每個結點的孩子結點排列起來,以單鏈表作為儲存結構,則n個結點有n個孩子鍊錶,如果是葉子結點則此單鏈表為空,然後n個頭指標又組成乙個線性表,採用順序儲存結構,存放在乙個一維陣列中
找父節點(爹)即只要找到對應的鍊錶的頭結點就可以,
孩子兄弟表示法:
任意一棵樹,它的結點的第乙個孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,我們設定兩個指標,分別指向該結點的第乙個孩子和此結點的右兄弟
找兒子比容易,找爹比較麻煩,需要遍歷
資料結構一之基本概念
一 列舉法解決問題 q a b c 1000,且a 2 b 2 c 2 a,b,c為自然數 如何求出所有abc可能的組合?a a 0,b 0,c 0 1000,利用三層巢狀。具體程式如下 import time start time time.time for a in range 1000 for...
資料結構 樹 基本概念
之前說的線性結構是一對一的關係,這裡的樹就是一對多的資料結構。樹 tree 是n n 0 個結點的有限集。n 0時稱為空樹。在任意一棵非空樹中 1 有且僅有乙個特定的稱為根 root 的結點 2 當n 1時,其餘結點可分為m m 0 個互不相交的有限集 樹的定義其實用到了遞迴的方法,就是說樹的定義之...
資料結構之樹的基本概念
樹是一種非線性的資料結構,它是若干節點的集合,是由唯一的根和若干個不相交的子樹組成的,其中每一棵子樹又是一棵樹。由此可知,樹是可以遞迴定義的,即在樹的定義中又用到了樹的定義。需要注意有乙個特殊情況,就是樹的節點可以為零,這個時候的樹就是一棵空樹。如下圖 其中a節點就是根節點,而b e k f l等節...