一.樹的概念:
1.樹的概念:
樹是一種非線性的資料結構,它是由n個有限節點組成的乙個具有層次關係的結合;
2.樹的特點:
每個節點有0個或多個子節點;沒有父節點的節點為根節點;每個非根節點有且只有乙個父節點,每個子節點可以分為多個不相交的子樹;
3.關於樹的幾個基本概念:
(1)節點的度:乙個節點含有的子樹的個數;
(2)葉節點:節點的度為0的節點;
(3)雙親節點:乙個節點含有子節點,則該節點就為父節點;
(4)孩子結點:乙個節點含有的子樹的根節點稱為該節點的子節點;
(5)節點的層次:從根開始為第一層,根的子節點為第二層,以此類推…;
(6)樹的高度或深度:樹中節點的最大層次;
(7)節點的祖先:從根到該節點所經分支上的所有節點;
二.二叉樹的概念及結構:
1.概念:
一棵二叉樹是結點的乙個有限集合,該集合或者為空,或者是由乙個根節點加上兩棵別稱為左子樹和右子樹 的二叉樹組成;
2.特點:
(1)每個節點最多有兩個子樹,即二叉樹不存在度大於二的節點;
(2)二叉樹的子樹有左右之分,其子樹的次序不能顛倒;
3.性質:
(1)若規定根結點的層數為1,則一棵非空二叉樹的第i層最多有2^(i-1)個結點;
(2)若規定只有根節點的二叉樹的深度為1,則深度為k的二叉樹的最大結點數為2^k-1個結點;
(3)對於任何一棵二叉樹,如果其葉節點個數為n0,度為2的非葉子結點的個數為n2,則n0=n2+1;
(4)n個節點的完全二叉樹的深度k為log2^(n+1)上取整;
(5)對於具有n個結點的完全二叉樹,如果按照從上至下,從左至右的順序對所有結點從0開始編號,則對於序號為i的結點有:
若i>0,雙親序號:(i-1)/2; i=0;i為根節點編號,無雙親結點;若2i+1(6)子樹是不相交的;除了根節點外每個節點僅僅有乙個父節點; 一棵n個結點的樹有n-1條邊;
4.特殊二叉樹:
(1)滿二叉樹:乙個二叉樹的每一層的節點都達到了最大值,則就是滿二叉樹;如果該二叉樹的層數為k層,則二叉樹的節點個數為2^k -1;
(2)完全二叉樹:一棵二叉樹至多只有最下面的一層上的結點的度數可以小於2,並且最下層上的結點都集中在該層最左邊的若干位置上,而在最後一層上,右邊的若干結點缺失的二叉樹,則此二叉樹成為完全二叉樹;
5.二叉樹的儲存結構:
(1)順序儲存:順序結構的儲存就是通過陣列來進行儲存;完全二叉樹用順序儲存來進行儲存,因為不會造成空間上的浪費;堆的建立和演算法會通過順序儲存來進行儲存;
(2)鏈式儲存:二叉樹的鏈式儲存結構是指,用鍊錶來表示一棵二叉樹,即用鍊錶來指示元素的邏輯關係;通常的方法是鍊錶中每個結點由三個域組成,資料域和左右指標域,左右指標分別用來給出該結點左孩子和右孩子所在的鏈結點的儲存位址;
三.二叉樹的順序結構及實現:
普通的二叉樹不適合使用順序結構進行儲存,因為會造成大量的空間浪費,而完全二叉樹可以使用順序結構來進行儲存;而二叉樹的順序儲存主要是來進行堆儲存;
1.堆的概念及結構:
如果有乙個關鍵碼的集合k = ,把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足:ki <= k2i+1 且 ki<= k2i+2 (ki >= k2i+1 且 ki >= k2i+2) i = 0,1,2…,則稱為小堆(或大堆);
如下圖所示:
根結點最大的堆為大堆,根結點最小的堆為小堆;
2.堆的實現:向下調整法
(從上往下進行二叉樹的結點的調整,使其滿足最大堆或最小堆)
(1)前提條件:除了乙個位置外,其他地方都滿足堆的性質;
左孩子的結點:leftidx=2*rootidx+1;
右孩子的結點:rightidx=2*rootidx+2;
已知孩子的結點,求根的結點:rootidx=(size-1-1)/2;
#include
#include
void
adjustdown
(int arr,
int size,
int idxroot)
//如果有葉子,找到最小的值;
int idxmid=idxleft;
if(idxright
)//最小孩子的下標是idxmid;
if(arr[idxroot]
)else
}
3.建立堆:把乙個隨機分布的無序數列變成乙個滿足堆的性質;
倒著調整;最後乙個非葉子結點就是最後乙個結點的雙親,即:
parent=(child-1)/2;-----》parent=(size-1-1)/2;
#include
#include
void
adjustdown
(int arr,
int size,
int idxroot)
//如果有葉子,找到最小的值;
int idxmid=idxleft;
if(idxright
)//最小孩子的下標是idxmid;
if(arr[idxroot]
)else
}void
creatheap
(int arr,
int size)
}
利用堆的找最值的特點做具體的應用:
1.優先順序對列;
2.排序問題;
3.top k問題;
關於堆的排序問題:排公升序建大堆,排降序建小堆;
#include
using namespace std;
void
adjustdown
(int
,int
,int);
void
buildmaxheap
(int a,
int len)
}void
adjustdown
(int a,
int k,
int len)
} a[k]
= temp;
//找到了最終的位置並放入
}void
heapsort
(int a,
int len)
//堆排序:每次將堆頂元素和最後乙個元素交換,再將剩餘i-1個元素調整為新的堆,重複到堆只有乙個元素
}int
main()
;//為了方便下標為i時左右孩子的下標為2i,2i+1,陣列從1開始儲存
heapsort
(a,8);
for(
int i =
1; i <=
8; i++
)system
("pause");
return0;
}
二叉樹基本概念及性質
二叉樹基本概念 在電腦科學中,二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作 左子樹 left subtree 和 右子樹 right subtree 二叉樹常被用於實現二叉查詢樹和二叉 堆。二叉樹的每個結點至多只有二棵子樹 不存在度大於2的結點 二叉樹的子樹有左右之分,次序不能顛倒。二叉樹...
資料結構 樹的基本概念及二叉樹的基本操作
樹被定義為由若干個結點和若干條邊組成的資料結構 樹的基本概念和性質 1 樹可以沒有結點,這種情況下把樹稱為空樹 empty tree 2 樹的層次從根節點開始算起,即根為第一層,其子結點為第二層,以此類推 3 把結點的子樹棵樹稱為結點的度,而結點中最大的度稱為樹的度 4 由於一條邊連線兩個結點,且樹...
二叉樹的基本概念
二叉樹的概念 一棵二叉樹是結點的乙個有限集合,該集合或者為空,或者是由乙個根節 點加上兩棵分別稱為左子樹和右子樹的二叉樹組成 特點 因此 二叉樹是通過上述5中形式的組合或巢狀而形成 滿二叉樹 完全二叉樹 二叉樹的性質 二叉樹的儲存結構 二叉樹主要有順序儲存和鏈式儲存結構 順序儲存結構 對於一棵完全二...