A. 二叉排序樹的平均查找長度怎樣計算
要是哪舉粗里看塵檔不懂可以評論!正兄鎮
B. 二叉樹的深度怎麼算
一顆樹只有一個節點,它的深度是1;
根節點只有左子樹而沒有右子樹,那麼二叉樹的深度應該是其左子樹的深度加1;
根節點只有右子樹而沒有左子樹,那麼二叉樹的深度應該是其右樹的深度加1;
根節點既有左子樹又有右子樹,那麼二叉樹的深度應該是其左右子樹的深度較大值加1
C. 二叉樹的深度演算法怎麼算啊
二叉樹的深度演算法:
一、遞歸實現基本思想:
為了求得樹的深度,可以先求左右子樹的深度,取二者較大者加1即是樹的深度,遞歸返回的條件是若節點為空,返回0
演算法:
1
int
FindTreeDeep(BinTree
BT){
2
int
deep=0;
3
if(BT){
4
int
lchilddeep=FindTreeDeep(BT->lchild);
5
int
rchilddeep=FindTreeDeep(BT->rchild);
6
deep=lchilddeep>=rchilddeep?lchilddeep+1:rchilddeep+1;
7
}
8
return
deep;
9
}
二、非遞歸實現基本思想:
受後續遍歷二叉樹思想的啟發,想到可以利用後續遍歷的方法來求二叉樹的深度,在每一次輸出的地方替換成算棧S的大小,遍歷結束後最大的棧S長度即是棧的深度。
演算法的執行步驟如下:
(1)當樹非空時,將指針p指向根節點,p為當前節點指針。
(2)將p壓入棧S中,0壓入棧tag中,並令p執行其左孩子。
(3)重復步驟(2),直到p為空。
(4)如果tag棧中的棧頂元素為1,跳至步驟(6)。從右子樹返回
(5)如果tag棧中的棧頂元素為0,跳至步驟(7)。從左子樹返回
(6)比較treedeep與棧的深度,取較大的賦給treedeep,對棧S和棧tag出棧操作,p指向NULL,並跳至步驟(8)。
(7)將p指向棧S棧頂元素的右孩子,彈出棧tag,並把1壓入棧tag。(另外一種方法,直接修改棧tag棧頂的值為1也可以)
(8)循環(2)~(7),直到棧為空並且p為空
(9)返回treedeep,結束遍歷
1
int
TreeDeep(BinTree
BT
){
2
int
treedeep=0;
3
stack
S;
4
stack
tag;
5
BinTree
p=BT;
6
while(p!=NULL||!isEmpty(S)){
7
while(p!=NULL){
8
push(S,p);
9
push(tag,0);
10
p=p->lchild;
11
}
12
if(Top(tag)==1){
13
deeptree=deeptree>S.length?deeptree:S.length;
14
pop(S);
15
pop(tag);
16
p=NULL;
17
}else{
18
p=Top(S);
19
p=p->rchild;
20
pop(tag);
21
push(tag,1);
22
}
23
}
24
return
deeptree;
25
}
D. 二叉樹路徑長度問題
因為肢雀裂每個節點都只有一個父歲芹節點,所以二叉樹的路徑是唯一的,歷閉那麼計算的時候最簡單的方法就是數「橋」的個數,也就是一個路徑上所有節點個數減1,」橋「指連接兩個相鄰節點的線。
E. 如何用C語言或C++語言實現二叉排序樹的平均查找長度的計算
main()
{
int x,y,z,t;
scanf("%d%d%d",&x,&y,&z);
if (x>y)
{t=x;x=y;y=t;} /*交換x,y的值*/
if(x>z)
{t=z;z=x;x=t;}/*交換x,z的蔽大困值*/
if(y>z)
{t=y;y=z;z=t;}/*交換z,y的值*/
printf("宏念仿皮small to big: %d %d %d\n",x,y,z);
}
F. 分塊查找平均查找長度計算公式是什麼順序查找和折半
順喊族序查找:O(n)
折半查找:O(log2n)
分塊查找:大致 O(n^0.5)
二叉排序樹:介於O(log2n)和O(n)之間
平衡二叉樹:O(log2n)
m階B-樹:O(logmn)
散列或者音譯哈希平均查找長度與結點鋒蔽個數無關的查找方法,ASL的理論值只與裝填因子銀滲州有關
G. 最差適配的平均查找長度
n個節點的二叉排序樹在最壞的情況下的平均查找長度為(n+1)/2。
二叉排序樹每個嫌芹陪結點的C(i)為該結點的層次數。最壞情況下,當先後插入的關鍵字有序時,構成的二叉排序樹蛻變為單支樹,樹的深度為芹蠢其平均查找長度(n+1)/2(和順序查找相同),最好的情況是二叉排序樹的形態和折半查找的判定樹相同,其平均查找長度和log 2 (n)成正比。
最差適應演算法(Worst Fit)為首改適應此演算法,空閑分區表(空閑區鏈)中的空閑分區要按大小從大到小進行排序,自表頭開始查找到第一個滿足要求的自由分區分配。該演算法保留小的空閑區,盡量減少小的碎片產生。
最差適應演算法,也稱最差適配演算法,它從全部空閑區中找出能滿足作業要求的、且大小最大的空閑分區,從而使鏈表中的結點大小趨於均勻,適用於請求分配的內存大小范圍較窄的系統。
H. 二叉搜索樹的平均查找長度及時間復雜度
推導過程如下:
假設有一顆二叉排序樹, 總結點數沒姿是n, 高度是h, 根結點的高度是1,
假設也是滿二叉樹, n與h的關系, 有公式: n = (2^h) - 1
也就是: h = log2(n+1)
對於高度為2,總結點數是3的二叉排序樹(滿二叉樹),查找成功的平均查找長度為:
對於高度為3,總結點數是7的二叉排序樹(滿二叉樹),查找成功的平均查找長度為:
對於高度為h,總結點數是n的二叉排序樹(滿二叉樹),查找成功的平均查找長度為:
對於[等式1]里的1*1 + 2*2 + 3*4 + ... + h*2^(h-1)
該數列有h項: 1*2^0, 2*2^1, 3*2^2, ... , h*2^(h-1)
其總和:
等式兩邊同乘以2,有:
用[等式3]減去[等式2]有:
其中(2^0 + 2^1 + 2^2 + 2^3 + ... + 2^(h-1))是等比數列求和,設:
等式兩邊同乘以2,有: 2*M = (2^1 + 2^2 + 2^3 + ... + 2^h)
兩個等式相減,有: M = 2^h - 1
將M代入[等式4]有:
因為 h = log2(n+1),將h代入[等式5],有:
也就是
將上述S代入[等式1],有:
所以,二叉排序樹查找成功的平均查找長度為:
其時間復雜度是: O(log2(n))
假設有一顆平衡的二叉排序樹,高度h=4,總結點數n=11,不是滿二叉樹:
根據[公式1],查找成功的平均查找長度為:
ASL = [(n+1)/n] * log2(n+1) - 1 = [(11+1)/11] * log2(11+1) - 1 約等於 2.91
逐個伏灶結點計數,平均查找長度為:
ASL = (1*1 + 2*2 + 3*4 + 4*4) / 11 = 33 / 11 = 3
假設有一顆平衡的二叉排序樹,高度h=4,總結點數n=15,是滿二叉樹:
根據[公式1],查找成缺察扮功的平均查找長度為:
ASL = [(n+1)/n] * log2(n+1) - 1 = [(15+1)/15] * log2(15+1) - 1 = 49/15
逐個結點計數,平均查找長度為:
ASL = (1*1 + 2*2 + 3*4 + 4*8) / 15 = 49/15
I. 數據結構中二叉排序樹的平均查找長度
先構造二叉排序樹,然後計算就行了:
(2×3+2×2+2)/7=1.7
J. 二叉排序樹的不成功的平均查找長度怎麼求
查找不成功就是從查找位置開始直到一個位置為空需要比較的次數。
比如:
62
/
30 74
/
15 56
/
48
找到所有的外結點,也就是查找失敗的點,然後計算ASL
就你的BST,結果敗老如下:
15的左右子樹都為空,也就是左右子樹都是外結點,失敗時需要比較62、30、15一共3次
48的左右子樹都為空,也就是左右子樹都是外結點,失敗時需要比較62、30、15、48一共4次
56的右昌枯棚子樹為空,也就是右子樹是外結點,失敗時需要比較62、30、56一共3次
74的左右子樹都為空,也就是左右子樹都是外結點,失敗時需要比較62、74一共2次
因此外結點總數為2 *3 + 1 = 7 (其實這個數量一定是關鍵字個數加1)
所以ASL = (2 * 3 + 2 * 4 + 1 * 3 + 2 * 2) / 7 = 21 / 7 = 3。
查找步驟:
二叉樹
若根結點的關鍵字值等於查找的關鍵字,成功。否則,若小於根結點的關鍵字值,遞歸查左子樹。若大於根結點的關鍵字值,遞歸查右子樹。若子樹為空,查找不成功。
平均情況分析(在成功查找兩種的情況下):
在一般情況下,設 P(n,i)為它的左子樹的結點個數為 i 時的平均查找長度。如圖的結點個數為 n = 6 且 i = 3; 則 P(n,i)= P(6, 3) = [ 1+ ( P(3) + 1) * 3 + ( P(2) + 1) * 2 ] / 6= [ 1+ ( 5/3 + 1) * 3 + ( 3/2 + 1) * 2 ] / 6
注意:這里 P(3)、P(2) 是具有 3 個結點、2 個結點的二叉分類樹的平均查找長度。 在一般情況,P(i)為具有 i 個結點二叉分類樹的平均查找長度。平均查找長度= 每個結點的深度的總和 / 總結點數
參考耐則資料來源:網路-二叉排序樹