查詢技術 平衡二叉樹 雜湊表

2021-10-01 05:08:22 字數 2433 閱讀 8115

1、平衡二叉樹:或者是一棵空的二叉排序樹,或者是具有下列性質的二叉排序樹:

⑴ 根結點的左子樹和右子樹的深度最多相差1;

⑵ 根結點的左子樹和右子樹也都是平衡二叉樹。

平衡因子:結點的平衡因子是該結點的左子樹的深度與右子樹的深度之差。

在平衡樹中,結點的平衡因子可以是1,0,-1。

最小不平衡子樹:在平衡二叉樹的構造過程中,以距離插入結點最近的、且平衡因子的絕對值大於1的結點為根的子樹。

構造時,邊構造邊檢查。

2、

設結點a為最小不平衡子樹的根結點,對該子樹進行平衡調整歸納起來有以下四種情況

ll型rr型

lr型rl型

ll型:

b=a->lchild;

a->lchild=b->rchild;

b->rchild=a;

a->bf=0; b->bf=0;

if (fa==null) root=b;

else if(a==fa->lchild) fa->lchild=b;

else fa->rchild=b;

rr型:

b=a->rchild;

a->rchild=b->lchild;

b->lchild=a;

a->bf=0; b->bf=0;

if (fa==null)

root=b;

else if (a==fa->lchild)

fa->lchild=b;

else

fa->rchild=b;

lr型:

b=a->lchild;c=b->rchild;

b->rchild=c->lchild;

a->lchild=c->rchild;

c->lchild=b; c->rchild=a;

rl型:

b=a->rchild;    c=b->lchild;

b->lchild=c->rchild;

a->rchild=c->lchild;

c->lchild=a; c->rchild=b;

綜上所述, 在乙個平衡二叉排序樹上插入乙個新結點s時,主要包括以下三步:

(1) 查詢應插位置, 同時記錄離插入位置最近的可能失衡結點a(a的平衡因子不等於0)。

(2) 插入新結點s, 並修改從a到s路徑上各結點的平衡因子。

(3) 根據a、 b的平衡因子, 判斷是否失衡以及失衡型別, 並做相應處理。

3、雜湊表的查詢技術

雜湊函式的構造:

直接定址法:h(key) = a * key + b (a,b為常數)

除留餘數法:h(key)=key mod p (p為小於或等於表長(最好接近表長)的最小素數)

數字分析法:事先知道關鍵碼的分布,關鍵碼的分布均勻

平方取中法:事先不知道關鍵碼的分布且關鍵碼的位數不是很大。

摺疊法(分段疊加法):關鍵碼位數很多,事先不知道關鍵碼的分布。

衝突處理方法:

①開放定址法(閉雜湊方法):

用開放定址法處理衝突得到的雜湊表叫閉雜湊表。

如何尋找下乙個空的雜湊位址?

(1)線性探測法

hi=(h(key)+di) % m (di=1,2,…,m-1)

int hashsearch1(int ht[ ], int m, int k) 

if (i==j) throw "溢位";

else ht[i]=k; //查詢不成功時插入

}

(2)二次探測法:hi=(h(key)+di)% m

(di=12,-12,22,-22,…,q2,-q2且q≤m/2)

(3)隨機探測法:hi=(h(key)+di)% m

(di是乙個隨機數列,i=1,2,……,m-1)

(4)再hash法

②鏈位址法(拉鍊法、開雜湊方法)

用拉鍊法處理衝突構造的雜湊表叫做開雜湊表。

node*hashsearch2(node*ht[ ], int m, int k)

}

③建立公共溢位區

雜湊表包含基本表和溢位表(順序存放)兩部分(通常溢位表和基本表的大小相同)

雜湊表:採用雜湊技術將記錄儲存在一塊連續的儲存空間中,這塊連續的儲存空間稱為雜湊表。

雜湊函式:將關鍵碼對映為雜湊表中適當儲存位置的函式。

雜湊既是一種查詢技術,也是一種儲存技術。

平衡二叉樹例題 平衡二叉樹

acwing 72.平衡二叉樹 思路一 求每個節點的左右子樹深度,根據深度差判斷,直到葉子節點結束,效率不夠高,每個節點都要用兩次計算深度的遞迴函式 思路二 從葉子節點開始,計算深度差,一旦有深度差大於1的,就直接返回0,也不用管上面的深度是不是正確了,畢竟我們只需要true和false兩種狀態,省...

二叉查詢樹與平衡二叉樹

二叉查詢樹的性質 對於樹中的每乙個節點x,它的左子樹中所有關鍵字值小於x的關鍵字值,它的右子樹中的所有關鍵字值大於x的關鍵字值。二叉查詢樹的平均深度為o logn 下面看一下它的相關的操作函式。刪除乙個二叉樹 遞迴形式 void makeempty treenode root 在二叉查詢樹中找都某個...

二叉樹 平衡二叉樹

1.題目 給定乙個二叉樹,判斷這棵二叉樹是否是高度平衡的二叉樹 平衡二叉樹 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1 2.題目分析 1 如果乙個節點的兩個子樹的深度之差超過1,則不是平衡二叉樹 2 如果乙個節點的兩個子樹的深度之差不超過1,則是平衡二叉樹 3.程式分析 1 若這棵二...