樹的定義
樹和圖一樣都是非線性結構,樹是n個結點的有限集合,當n=0時,稱這棵樹為空樹。 非空樹有以下特征:
- 有且僅有一個稱為根的結點。
- 如果n>1, 除根結點以外其它結點可以分為m(m>0)個不相交的集合T1,T2,T3,T4,......,Tm,其中每一個集合都是一棵樹。樹T1, T2, T3,......,Tm稱為這棵對的子樹。
下圖就是一棵普通的樹:
相關術語
- 節點:樹是由有限個元素組成的集合,每人元素都稱作一個節點,上圖A、B、 C、 D、 E、 F、G、H、I等都是樹的節點;
- 節點的度:一個節點含有的子樹的個數稱為該節點的度;
- 葉節點或終端節點:度為0的節點稱為葉節點,D,E,C,G都是葉節點;
- 非終端節點或分支節點:度不為0的節點;
- 子節點(孩子節點): 一個節點含有的子樹的根節點稱為該節點的子節點;
- 父節點(雙親節點):若一個節點含有子節點,則這個節點稱為其子節點的父節點;
- 兄弟節點:具有相同父節點的節點互稱為兄弟節點;
- 堂兄弟節點:雙親在同一層的節點互為堂兄弟;
- 節點的祖先:從根到該節點所經分支上的所有節點;
- 子孫節點:以某節點為根的子樹中任一節點都稱為該節點的子孫;
- 森林:由m(m>=0)棵互不相交的樹的集合稱為森林;
- 樹的度:一棵樹中,最大的節點的度稱為樹的度;
- 節點的層次:從根開始定義起,根為第1層,根的子節點為第2層,以此類推;
- 樹的高度或深度:樹中節點的最大層次;
樹的分類
- 有序樹:樹的各個子樹的順序是固定的,不能隨意改變順序。
- 無序樹:樹的各個子樹的順序可變。
- 二叉樹: 每個節點最多只能有兩個子節點的樹稱為二叉樹,二叉樹是有序樹,左右子樹的順序不能改變。二叉樹又可以分為滿二叉樹和完全二叉樹。
- B樹
- 霍夫曼樹
樹的存儲
計算機的內存是線性的, 而樹是非線性的數據結構,如何將非線性的樹狀結構在線性的內存中存儲起來,這是一個值得探討的問題。目前主要有以下幾種存儲方式:
1、雙親表示法:
- 實現:通常用一個二維數組,在存儲結點的同時也將對應節點的父節點存儲進來。
- 特點:找父節點容易、找子節點難。
2、 孩子表示法:
- 實現:每個結點都存儲在一個二維數組的第一列里面,多個子節點之間以鏈表方式連接,最后一個子節點的指向為NULL,數組的第二個元素指向其子節點鏈表的起始地址。
- 特點:找子節點容易,找父節點難。
3、 雙親孩子表示法:
- 實現:將雙親表示法與孩子表示法綜合起來,既存儲父節點的下標,又指向子節點鏈表。
- 特征:找父節點與子節點都比較方便,但相對前面兩種復雜度有一定程度的提升。
4、二叉樹存儲:
- 二叉樹存儲就是將普通的樹轉換成二叉樹后再進行存儲,二叉樹的存儲將另作討論。
- 將普通樹轉換成二叉樹有一個方法,左孩子右兄弟法,就是說從根節點開始,每個節點的左子節點存儲它的一個孩子,右子節點存儲它的一個兄弟,如下圖所示:
森林的存儲
森林是由多棵互不相交的樹組成的集合,存儲方式與樹轉換成二叉樹存儲方式類似。
- 將森林中的每一棵對都轉換成對應的二叉樹。
- 將第二棵二叉樹作為每一棵二叉樹根節點的右孩子,將第三棵二叉樹作為第二棵二叉樹根節點的右孩子,依次類推,最終得到的二叉樹就是由森林轉換成的二叉樹。
關於本文
主要介紹了一下樹的相關概念和術語以及樹和森林的存儲方法等相關知識,本人才疏學淺,疏漏或者錯誤之處在所難免,歡迎大家批評指正。