大概像下面這樣:node
樹的每一個點被稱爲節點;數組
鏈接的兩個點,一個爲父節點,一個爲子節點,例如上圖中,\(1\)是\(4\)的父節點,\(4\)是\(1\)的子節點;spa
沒有父節點的節點稱爲根節點,注意:每個非根節點的節點有且只有一個父節點;code
沒有子節點的節點稱爲葉子節點,如上圖中,\(6,10,5,9,7,8\)是葉子節點;blog
一棵樹必然由\(n\)個節點,\(n-1\)條邊組成;class
除了根節點外,每一個子節點能夠分爲多個不相交的子樹;二叉樹
同「輩分」的節點在樹的同一層裏,例如上圖,\(2,3,4\)是同一層的;遍歷
樹的深度就是樹的層數,例如上圖,樹的深度爲\(3\);im
樹裏面沒有環!db
使用結構體數組
struct node { int data,father; //data表明這個節點的編號 //father表明這個節點的父節點的編號 }tree[...];
一種特殊的樹,一個節點最多隻能有\(2\)個子節點,大概長下面這樣:
樹的概念在二叉樹中一樣有用,另外,還有幾個二叉樹獨有的性質:
在二叉樹的第\(i\)層上最多有\(2^{i-1}\)個節點\((i \ge 1)\);
深度爲\(k\)的二叉樹至多有\(2^{k-1}\)個節點\((k \ge 1)\);
一棵深度爲\(n\),節點數爲\(2^{n-1}\)的二叉樹,就像下圖:
一棵從上向下,從左向右標號和滿二叉樹對應的二叉樹,以下圖:
依然使用結構體數組。
struct node { int lchild,rchild,father; //lchild表明這個節點的左子節點 //rchild表明這個節點的右子節點 //father表明這個節點的父節點的編號 }tree[...];
二叉樹的前序遍歷順序爲:
1.訪問父節點
2.前序遍歷左子樹
3.前序遍歷右子樹
\(Code:\)
void qianxu(int a) { if(a) { cout<<a<<" "; qianxu(tree[a].lchild); qianxu(tree[a].rchild); } return ; }
如上圖,遍歷結果爲:1 3 9 5 4 6 10 2 7 8
二叉樹的前序遍歷順序爲:
1.前序遍歷左子樹
2.訪問父節點
3.前序遍歷右子樹
\(Code:\)
void zhongxu(int a) { if(a) { zhongxu(tree[a].lchild); cout<<a<<" "; zhongxu(tree[a].rchild); } }
如上圖,遍歷結果爲:9 3 6 4 10 5 1 7 2 8
二叉樹的前序遍歷順序爲:
1.前序遍歷左子樹
2.前序遍歷右子樹
3.訪問父節點
\(Code:\)
void houxu(int a) { if(a) { houxu(tree[a].lchild); houxu(tree[a].rchild); cout<<a<<" "; } }
如上圖,遍歷結果爲:9 6 10 4 5 3 7 8 2 1
一種特殊的徹底二叉樹,分小根堆和大根堆兩種堆。
大根堆:父節點必定比子節點大;
長的以下:
小根堆:父節點必定比子節點小。
長的以下: