1. 程式人生 > >資料結構——3.1樹與樹的表示

資料結構——3.1樹與樹的表示

一、引言

  1. 層次結構舉例
    家譜、城市(鄉鎮),檔案管理系統等
  2. 為什麼用層次結構呢?
    分層次組織在管理上具有更高的效率
  3. 查詢
    靜態查詢:對查詢的集合沒有插入和刪除操作,只有查詢
    動態查詢:對查詢的集合除查詢外,還可能發生插入和刪除
  4. 二分查詢的啟示
    例如11個元素的二分查詢判定樹
    在這裡插入圖片描述
    1)判定樹上每個結點需要的查詢次數剛好是該結點所在的層數
    2)查詢成功時查詢次數不會超過判定樹的深度
    3)n個結點的判定樹的深度為(int)(logn)+1
    4)平均查詢次數ASL=(44+43+2*2+1)/11=3
    要找4次的有4個(最底下那一層的四個結點),找3次的也有4個,找2次的有2個,找1次的有1個。
那麼,如果我們不用陣列的形式而是把資料放在這樣的一個層次化結構裡,是不是也能達到二分查詢的效果

二、樹的定義

樹(Tree):n(n>=0)個結點構成的有限集合。當n=0時,稱為空樹,對於任何一個非空樹(n>0),具備以下性質:
1)樹中有一個稱為“根(root)”的特殊結點,用r表示
2)其餘結點可分為m(m>0)個互不相交的有限集T1,T2,…,Tm,其中每個集合本身又是一棵樹,稱為原來樹的**“子樹”(SubTree)**
在這裡插入圖片描述
採用一種遞迴的方法來說明這樣的一個樹

1、樹與非樹

在這裡插入圖片描述
1)子樹是不相交
2)除了根節點外,每個結點有且僅有一個父節點
3)一棵N個結點的樹有N-1條邊

(因為每個結點都有往上的一條邊,只有根節點沒有)
樹是保證結點聯通的邊最少的一種連線方式。

2、樹的基本術語

1)結點的度(Degree):結點的子樹個數(每個結點連到往下的邊的個數,也就是子樹的個數)
2)樹的度:樹的所有結點中最大的度數
3)葉結點(Leaf)度為0的結點(沒有子樹的結點)
4)父結點(parent):有子樹的結點是其子樹的根節點的父結點
5)子結點(child):若A結點是B結點的父結點,則稱B結點是A結點的子結點;子結點也稱孩子結點
6)兄弟結點(Sibiling):具有同一父結點的各結點彼此是兄弟結點
7)路徑和路徑的長度:從結點n1到nk的路徑為一個結點序列

,n1,n2,…,nk,nj是nj+1的父結點路徑所包含邊的個數稱為路徑的長度
8)祖先結點(Ancestor):沿樹根到某一結點路徑上的所有其他結點都是這個結點的祖先結點。
9)子孫結點(Descendant):某一結點的子樹中的所有結點是這個結點的子孫
10)結點的層次(Level):規定根節點在1層,其他任何一結點的層數是其父結點的層數加1
11)樹的深度(Depth):樹中所有結點中的最大層次是這棵樹的深度

3、樹的表示

1)倘若用陣列來表示,其實有點困難,因為很難去表示它的父結點、子結點是哪一個元素。
2)倘若用連結串列表示,那麼就是用一個結構去表示這個結點,但是這樣每個結構的形式是不一樣的(因為有些有3個兒子,有些有2個兒子)
假如每個結點都用同樣的結構去表示,帶來的問題是,如果這個樹有n個結點,每個結點有k個指標域,那麼就有nk個指標域,而邊只有n-1條,也就是說只有n-1個指標域是非零的,就有nk-n+1個指標是空的,那麼久會造成空間上的浪費
比較好的方法是:
3)兒子-兄弟表示法
每個結點的結構是統一的,而且空間浪費也不大。n個結點是2n個指標域,其中有n-1條邊,所以意味著有n-1個指標域是非空的,那麼真正空的域是n+1
在這裡插入圖片描述
如果從根結點開始訪問其“次子”的“次子”,所經過的結點應該是從根結點開始訪問其“長子”的“長子”的“長子”的“長子”
把上面的方法旋轉45°,這個時候看到的是一個每個結點都有兩個指標的樹,一個指標指向左邊,一個指向右邊,每個結點最多是兩個兒子。這種樹叫做二叉樹,即度為2的樹。
在這裡插入圖片描述