理论基础 —— 树
【樹的定義】
樹是一種非線性的有序數據結構,能很好地描述有分支和層次特性的數據集合,其是遞歸定義的。
一顆樹是由 n(n>=0) 個元素組成的有限集合,其中:
- 當 n=0 時,稱為空樹
- 每個元素稱為結點(node)
對于任何一棵非空樹,滿足以下條件:
- 有且僅有一個特定的根結點 (root),其沒有前驅。
- 除根節點外每個結點都有唯一一個前驅結點
- 每個結點都有 0 或多個后繼結點
- 當 n>1 時,除根結點之外的其余結點被分成 m(m>0) 個互不相交的有限集合 T1,T2,…,Tm,其中每個集合又是一棵樹,并稱為這個根結點的子樹。
【樹的基本概念】
- 一個結點的子樹個數,稱為結點的度(degree),樹中各節點的度的最大值稱為這棵樹的度(tree degree)
- 度為 0 的結點稱為葉結點(leaf node),度不為 0 的結點稱為分支結點(branch node),根以外的分支結點稱為內部結點(internal node)
- 連接兩個相關聯的結點的線段稱為樹枝(branch)
- 上端結點為下端結點的父節點(parent node),下端結點為上端結點的子結點(children node),同一個父結點的多個子結點互稱兄弟結點(brother node)
- 從根結點到某個子結點所經過的所有結點稱為這個子結點的祖先(ancestor),以某個結點為根的子樹中的任一結點都是該結點的子孫(descendant)
- 規定一棵樹的根結點的層次(level)為 1,其它結點的層次等于它的父結點層次 +1
- 一棵樹中所有的結點的層次的最大值稱為樹的深度(depth)
- 將樹中結點按照從上層到下層,同層中從左到右的次序依次從 1 開始編號,這種編號方式稱為層序編號(level code),通過層序編號可以將一棵樹變為線性序列
- 對于樹中任意兩個不同的結點,如果從一個結點出發,自上而下沿著樹中連著結點的線段能到達另一結點,則稱它們之間存在著一條唯一的路徑(path),路徑上經過的邊數稱為路徑長度(path length),從根節點出發,到樹中的其余結點一定存在著一條路徑,不同子樹上的結點之間不存在路徑。
- 若一棵樹中結點的各子樹從左到右是有次序的,即若交換結點各子樹的相對位置會構成不同的樹,則稱為有序樹(ordered tree),反之,交換結點各子樹的相對位置后為同一棵樹,則為無序樹(unordered tree)
- m(m>=0)棵互不相交的樹的集合稱為森林(forest)
以下圖為例:
????
- 根節點:1,葉結點有:3、5、6、8、9,分支結點有:1、2、4、7,內部結點有:2、4、7,這棵樹的度為:3
- 對于根結點1來說,它是2、3、4的父節點,同時2、3、4是結點1的子節點,它們又是兄弟結點
- 對于結點8來說,1、4、7是它的祖先;對于4來說,7、8、9是它的子孫
- 根節點的層次為0,結點2、3、4的層次為1,結點5、6、7的層次為2,結點8、9的層次為3,這棵樹的深度為3
- 對于結點1與結點8自己存在的路徑,可用1、4、7、8來表示該路徑,該路徑的長度為3
【樹的存儲結構】
樹的存儲結構分為:父親表示法、孩子表示法、父親孩子表示法、孩子兄弟表示法
上述四種方法各有優劣,在應用時應根據實際情況靈活使用,具體內容:點擊這里
【樹的遍歷】
樹中最基本的操作是遍歷。
樹的遍歷是從根節點出發,按照某種次序訪問樹中的所有結點,使得每個結點僅被訪問一次。
根據樹的定義可知:一棵樹由根節點和 m 棵子樹構成,因此只要遞歸的遍歷根節點和 m 棵子樹即可遍歷整棵樹。
樹的遍歷通常分為三種方式:
- 前序遍歷:先訪問根結點,再從左到右按照先序思想遍歷各棵子樹。(實質上是深度優先遍歷)
- 后序遍歷:先從左到右遍歷各棵子樹,再訪問根結點。(實質上是深度優先遍歷)
- 層次遍歷:按層次從小到大逐個訪問,同一層次按照從左到右的次序。(實質上是廣度優先遍歷)
以下圖為例
先序遍歷的結果:125634789
后序遍歷的結果:562389741
層次遍歷的結果:123456789
總結
- 上一篇: 位数问题(信息学奥赛一本通-T1313)
- 下一篇: 欧拉回路(HDU-1878)