樹的基本概念
1: 樹屬於一種非線性數據結構//因爲線性數據結構只有唯一的前驅和後繼。
2: 樹以分支關係描述數據元素之間的層次結構
3: 樹(tree)是 n(n≥0) 個結點的有限集
4: 樹的結構中,有且僅有一個特殊的結點,稱爲樹的根結點(root)
5: 樹中存在唯一的稱爲根的數據元素
6: 樹中各子樹是互不相交的集合
7: 樹的根結點沒有前驅結點,除根之外的所有結點都有且只有一個前驅結點
8: 樹中所有的結點可以有0個或多個後繼結點
9: 結點(node)——表示樹中的數據元素
10: 結點的度(degree)——結點的子樹個數
11: 樹的度——樹中結點的最大度值
12: 葉子(leaf)結點——度爲0的結點
13: 分支結點——除葉子結點外的所有結點(度不爲0)
14: 孩子(child)——結點的子樹的根稱爲此結點的孩子
15: 雙親(parents)——結點的子樹稱此結點爲雙親
16: 兄弟(sibling)——具有同一雙親的孩子結點互稱兄弟(位於同一層次)
17: 結點的層次(level)——從根結點算起,根爲第一層,它的孩子爲第二層等以此類推
18: 樹的深度(depth)——樹中結點的最大層次數
19: 有序樹——樹中各結點的子樹看成從左到右是有次序的(即就是子樹位置不可以互換)
20: 森林(forest)——m(m >= 0)棵互不相交的樹的集合。
將一棵非空樹的根結點刪去,樹就變成一個森林;反之,給一個森林增加一個統一的根結點,森林就變成一棵樹。
21: 二叉樹是n(n>0)個結點的有限集,它或爲空樹(n=0),或由一個根結點和兩棵分別稱爲左子樹和右子樹的互不相交的二叉樹構成
22: 樹的高度:從結點x(某棵樹的根結點)向下到某個葉結點最長簡單路徑中邊的條數
23:樹中所有結點的度之和等於所有結點數減1。
24:樹與二叉樹是兩種不同的樹型結構。
備註:
對於整棵樹而言,樹的高度和深度是相等的。
而對於樹中相同深度的每個結點來說,它們的高度卻不一定相同。
樹的存儲也是多樣的。
先根遍歷和後根遍歷算法都是遞歸的。
樹的遍歷
先根遍歷
後根遍歷
中序遍歷
中序遍歷順序:左子樹–根節點–右子樹。
更簡單的方法-直接將樹向下投影。
層次遍歷
森林的遍歷
樹的存儲方式
雙親表示法
——用一組連續的空間存儲數的節點,同時在每個元素中附帶一個用於指示其雙親節點在數組中下標的指示器。
孩子鏈表表示法
——與雙親表示法相反,每個節點在保存數據的同時記錄其左右孩子的下標。
孩子兄弟表示法
——在存儲結點信息的同時,附加兩個分別指向該結點最左孩子和右鄰兄弟的指針域leftmostchild和rightsibling,即可得樹的孩子兄弟鏈表表示
——利用二叉鏈表存儲數,按照左節點, 右兄弟的形式存儲。
ans: M2 + M3
森林 -> 二叉樹(從下到上)
樹轉二叉樹
一棵樹中的葉子數一定等於與其對應的二叉樹的葉子數(X)
節點的孩子放在左子樹
節點的兄弟放在右子樹
這裏並不是n1個節點。而是n1 - 1個, 因爲在轉換之後之前的n1中有一個節點做了根節點。