資料結構筆記 — 樹
樹
1.1 樹的概念
-
樹
(Tree)
是n(n>=0)個結點的有限集,當n=0
時成為空樹,在任意一棵非空樹中-
有且僅有一個 特定的稱為根
(Root)
的結點 -
當
n>1
時,其餘結點可分為m(m>0)
個互不相交的有限集1、T2、..、Tm
,其中每一個集合本身又是一棵樹,並且稱為根的子樹(SubTree)
-
-
每一個圈稱為樹的一個 結點 ,結點擁有的子樹數稱為 結點的度 (Degree) ,樹的度取樹內各結點的度的 最大值
-
度為
0
的結點稱為葉結點(Leaf)
或終端結點 -
度不為
0
的結點稱為分支結點點或非終端結點,除根結點外,分支結點也稱為內部結點
-
-
節點間關係
-
結點的子樹的根稱為結點的孩子
(Child)
,相應的,該結點稱為孩子的雙親(Parent)
,同一雙親的孩子之間互稱為兄弟(Sibling)
-
結點的祖先是從根到該結點所經分支上的所有結點
-
-
結點的層次
-
結點的層次
(Level)
從根開始,根為第一層,根的孩子為第二層 -
其雙親在同一層的結點互為堂兄弟
-
樹中結點的最大層次稱為樹的深度
(Depth)
或高度
-
-
如果將樹中結點的各子樹看成從左至右是有次序的,不能互換的,則稱該樹為有序樹,否則稱為無序樹
-
森林
(Forest)
是m(m>=0)
棵互不相交的樹的集合。對樹中每個結點而言,其子樹的集合即為森林
1.2 樹的結構及表示
雙親表示法
#define MAX_TREE_SIZE 100 typedef int ElemType ; typedef struct PTNode{ ElemType data; //結點資料 int parent; //雙親位置 } PTNode; typedef struct { PTNode nodes[MAX_TREE_SIZE]; int r; //根的位置 int n; //結點數目 } PTree;
-
此種表示法中,我們可以根據某節點的
parent
指標找到其雙親結點,時間複雜度為O(1)
parent == 1
時,表示找到了樹的根節點 -
但是,如果想要知道某結點的孩子,那麼只能遍歷整個樹,此時,應當改變一下表示方法
孩子表示法
-
每個結點的指標指向一個連結串列,連結串列中存放的是其孩子結點所對應的的下標值
孩子雙親表示法
-
將上方的孩子表示法進行完善,加入每個結點的雙親所對應的下標即可
#include <stdio.h> #define MAX_TREE_SIZE 100 typedef char ElemType; //孩子結點 typedef struct CTNode{ int child; //孩子結點的下標 struct CTNode *next; //指向下一孩子結點的指標 } *ChildPtr; //表頭結構 typedef struct { ElemType data; //存放樹中結點的資料 int parent; //存放雙親的下標 ChildPtr firstChild; //指向第一個孩子的指標 } CTBox; //樹結構 typedef struct { CTBox nodes[MAX_TREE_SIZE]; //結點陣列 int root, num; //根節點和節點數量 } CTree;
2 二叉樹
-
二又樹
(Bnary Tree)
是n(n>=0)
個結點的有限集合,該集合或者為空集(空二又樹)
,或者由一個根結點和兩棵互不相交的、分別稱為根結點點的左子樹和右子樹的二又樹組成 -
二叉樹特點
-
每個結點最多有兩棵子樹,所以二又樹中不存在度大於
2
的結點 -
左子樹和右子樹是有順序的,次序不能顛倒
-
即使樹中某結點只有一棵子樹,也要 區分它是左子樹還是右子樹
-
-
斜樹:均為左子樹或者均為右子樹
-
滿二叉樹 :在一棵二又樹中,如果所有分支結點 都存在左子樹和右子樹 ,並且 所有葉子都在同一層 上,這樣的二又樹稱為滿二又樹
-
特點
-
葉子只能出現在最下一層
-
非葉子結點的度一定是
2
-
在同樣深度的二又樹中,滿二又樹的結點個數一定最多,同時葉子也是最多
-
-
-
完全二叉樹 :對一棵具有
n
個結點的二又樹按層序編號,如果編號為i(1<=i<=n)
的結點與同樣深度的滿二又樹中編號為i
的結點點位置完全相同,則這棵二叉樹稱為完全二又樹
-
-
特點
-
葉子結點只能出現在最下兩層
-
最下層的葉子一定集中在左部連續位置
-
倒數第二層,若有葉子結點,一定都在右部連續位置
-
如果結點度為
1
,則該結點只有左孩子 -
同樣結點樹的二又樹,完全二又樹的深度最小
-
滿二叉樹一定是完全二叉樹,但完全二叉樹不一定是滿二叉樹
-
-
-
二叉樹的性質
-
二叉樹的第
i
層至多有 個結點(i >= 1)
-
深度為
k
的二叉樹至多有 個結點(k >= 1)
-
對於任意一棵二叉樹
T
,如果其終端結點數為 ,度為2
的結點數為 ,則 n0 = n1 + 1
-
-
-
如果對一棵擁有
n
個結點的完全二叉樹(深度為)的結點按照層序編號,對於任意結點i(1 <= i <= n)
具有以下性質:-
如果
i = 1
,則結點i
是二叉樹的根,無雙親 -
如果
i > 1
,則其雙親是結點 [ i / 2] (下限取整) -
如果
2i > n
,則結點i
無左孩子(結點i
為葉子結點 ),否則其左孩子是結點2i
-
如果
2i+1 > n
,則結點i
無右孩子,否則其右孩子是結點2i+1
-
-
>>>>> CONTINUE <<<<<