锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鏍囬: 鍏充簬騫寵 浜屽弶鏍?AVL tree)鏃嬭漿鍚庡鉤琛℃爣蹇楄皟鏁寸殑璁$畻鍏紡
浣滆? 鍙墮铏?/span>
寤虹珛: 2009.10.18
鍙樻洿: 2010.06.22
--------------------------------------------------------------------------------
1. 寮曡█
騫寵 浜屽弶鏍戠殑騫寵 鏍囧織璁$畻鍙互璇存槸鏈綆鍗曠殑, 涔熷彲浠ヨ鏄疉VL鏍戜腑鏈闅劇殑銆傚鉤琛℃爣
蹇楄綆楁柟娉曟湁涓ょ錛?/span>
a. Balance = Height(Left) - Height(Right);
b. Balance = Height(Right) - Height(Left);
鍏朵腑 Height 涓虹粨鐐圭殑瀛愭爲楂樺害(>= 0), 綆楁硶綆鍗曞氨鏄鍙宸﹀彸瀛愭爲楂樺害鐩稿噺鍗沖彲,
浣嗚繍琛屾晥鐜囦笉楂樸傚綋緇撶偣鏁頒笂鍗冧互涓婃椂, 棰戠箒澧炲垹緇撶偣甯︽潵寮閿浼氱浉褰撳彲瑙? 姝e洜濡傛,
鏈漢閫氳繃鎺ㄧ悊寰楀埌鐨勮綆楀叕寮忓氨闈炲父閲嶈浜嗐?/span>
2. 鍋囪
a. 緇撶偣瀹氫箟
typedef struct TAVLNode
{
void* Item; // 瀛樻斁欏?/span>
TAVLNode* Left; // 宸﹀瓙緇撶偣
TAVLNode* Right; // 鍙沖瓙緇撶偣
TAVLNode* Parent; // 鐖剁粨鐐?/span>
char Balance; // 騫寵 鏍囧織: [-1..1]
} *PAVLNode;
b. 騫寵 澧為噺 D 鍜?D', D 涓哄乏瀛愭爲澧為噺, D' 涓哄彸瀛愭爲澧為噺, 涓?D = -D', D 鍙互瀹氫箟
涓?1 鎴?-1, 鍏朵腑:
1). D = 1 鍒欒〃紺哄鉤琛℃爣蹇楄綆楁柟娉曚負: Height(Left) - Height(Right)
2). D = -1 鍒欒〃紺哄鉤琛℃爣蹇楄綆楁柟娉曚負: Height(Right) - Height(Left)
c. 緇撶偣楂樺害鐨勫嚱鏁?H, 鍒欑粨鐐?n 鏈?
H(n) = M(H(n.Left), H(n.Right)) + D, 鍚屾椂 H(NULL) = 0
鍏朵腑, M(H(n.Left), H(n.Right) 鍑芥暟鎻忚堪濡備笅:
1). |H(n.Left)| >= |H(n.Right)| 鍒欏間負: H(n.Left)
2). |H(n.Left)| < |H(n.Right)| 鍒欏間負: H(n.Right)
d. 緇撶偣騫寵 鏍囧織鐨勫嚱鏁?B, 鍒欑粨鐐?n 鏈?
B(n) = n.Balance = H(n.Left) - H(n.Right)
3. 鏃嬭漿鏂瑰紡(Left-Left)
a. 鏃嬭漿鍓嶇殑鏍戠粨鏋勫拰鍑芥暟鏂圭▼濡備笅:
(p) B(p) = H(t) - H(1) = 2D
/ \
(t) (1) B(t) = H(n) - H(2)
/ \
(n) (2) B(n) = H(3) - H(4)
/ \
(3) (4) 鍚屾椂蹇呭畾瀛樺湪: B(t) != D', 鍙互鐢ㄥ弽璇佹硶璇佹槑.
b. 鏃嬭漿鍚庣殑鏍戠粨鏋勫拰鍑芥暟鏂圭▼濡備笅: (娉? 緇撶偣 p, t, n 鏃嬭漿鍚庡垎鍒畾涔変負 P, T, N)
( T ) B(T) = H(N) - H(P)
/ \ B(N) = H(3) - H(4)
(N) (P) B(P) = H(2) - H(1)
/ \ / \
(3) (4) (2)(1) 鍚屾椂蹇呭畾瀛樺湪: B(P) != D', 鍙互鐢ㄥ弽璇佹硶璇佹槑.
c. B(N) 鍏紡
B(N) = H(3) - H(4) \
B(n) = H(3) - H(4) / => B(N) = B(n) = n.Balance
d. B(P) 鍏紡
B(t) = H(n) - H(2) => H(2) = H(n) - B(t) -+
B(p) = H(t) - H(1) = 2D => H(1) = H(t) - 2D +
B(P) = H(2) - H(1) -+
=> B(P) = H(n) - H(t) - B(t) + 2D \
鐢變簬蹇呭畾: B(t) != D' => H(t) = H(n) + D /
=> B(P) = D - B(t) = D - t.Balance
e. B(T) 鍏紡
B(t) = H(n) - H(2) => H(n) = B(t) + H(2) -+
鐢變簬蹇呭畾: H(N) == H(n) => B(T) = H(n) - H(P) +
鐢變簬蹇呭畾: B(P) != D' => H(P) = H(2) + D -+
=> B(T) = B(t) + H(2) - (H(2) + D)
=> B(T) = B(t) - D = t.Balance - D
f. H(T) - H(p) 鍏紡 (鍗寵皟鏁村悗鐨勯珮搴﹀彉鍖?
B(T) = B(t) - D => B(T) != D
=> H(T) = H(P) + D -+
H(P) = / H(1) + 2D 褰?B(P) == D +
\ H(1) + D 褰?B(P) == 0 -+
=> H(T) = / H(1) + 3D 褰?B(P) == D -+
\ H(1) + 2D 褰?B(P) == 0 |
+ =>
H(p) = H(t) + D \ |
H(t) = H(1) + 2D / => H(p) = H(1) + 3D -+
H(T) - H(p) = / 0 褰?B(P) == D => B(t) == 0
\ -D 褰?B(P) == 0 => B(t) != 0
4. 鏃嬭漿鏂瑰紡(Left-Right)
a. 鏃嬭漿鍓嶇殑鏍戠粨鏋勫拰鍑芥暟鏂圭▼濡備笅:
(p) B(p) = H(t) - H(1) = 2D
/ \
(t) (1) B(t) = H(2) - H(n)
/ \
(2) (n) B(n) = H(3) - H(4)
/ \
(3) (4) 鍚屾椂蹇呭畾瀛樺湪: B(t) != D, 鍙互鐢ㄥ弽璇佹硶璇佹槑.
b. 鏃嬭漿鍚庣殑鏍戠粨鏋勫拰鍑芥暟鏂圭▼濡備笅: (娉? 緇撶偣 p, t, n 鏃嬭漿鍚庡垎鍒畾涔変負 P, T, N)
( N ) B(N) = H(T) - H(P)
/ \ B(T) = H(2) - H(3)
(T) (P) B(P) = H(4) - H(1)
/ \ / \
(2) (3) (4)(1) 鍚屾椂蹇呭畾瀛樺湪: B(P) != D, 鍙互鐢ㄥ弽璇佹硶璇佹槑.
c. B(T) 鍏紡
H(n) = / H(3) + 2D 褰?B(n) == D'
\ H(3) + D 褰?B(n) != D' -+
|
B(t) = H(2) - H(n) => H(2) = H(n) + B(t) \ +
B(T) = H(2) - H(3) / |
=> B(T) = H(n) - H(3) + B(t) -+
=> B(T) = / B(t) + 2D 褰?B(n) == D'
\ B(t) + D 褰?B(n) != D'
=> B(T) = / t.Balance + 2D 褰?B(n) == D'
\ t.Balance + D 褰?B(n) != D'
d. B(P) 鍏紡
H(n) = / H(4) + 2D 褰?B(n) == D
\ H(4) + D 褰?B(n) != D -+
|
鐢變簬蹇呭畾: B(t) != D => H(t) = H(n) + D \ +
B(p) = H(t) - H(1) = 2D => H(1) = H(t) - 2D / |
=> H(1) = H(n) - D -+
=> H(1) = / H(4) + D 褰?B(n) == D
\ H(4) 褰?B(n) != D -+
+
B(P) = H(4) - H(1) -+
=> B(P) = / D' 褰?B(n) == D
\ 0 褰?B(n) != D
e. B(N) 鍏紡
+- 2D 褰?B(T) == 2D -+
瀹氫箟 X(T) = + D 褰?B(T) == D |
+- 0 褰?B(T) == 0 |
=> X(T) = B(T) + => H(T) = H(3) + B(T) + D -+
+- H(3) + 3D 褰?B(T) == 2D | |
H(T) = + H(3) + 2D 褰?B(T) == D | |
+- H(3) + D 褰?B(T) == 0 -+ |
B(N) = H(T) - H(P) +
瀹氫箟 X(P) = / D 褰?B(P) == D' -+ |
\ 0 褰?B(P) == 0 | |
=> X(P) = -B(P) + => H(P) = H(4) - B(P) + D -+
H(P) = / H(4) + 2D 褰?B(P) == D' |
\ H(4) + D 褰?B(P) == 0 -+
=> B(N) = H(3) - H(4) + (B(T) + B(P)) \
B(n) = H(3) - H(4) /
=> B(N) = B(n) + B(T) + B(P)
= n.Balance + B(T) + B(P)
f. H(N) - H(p) 鍏紡 (鍗寵皟鏁村悗鐨勯珮搴﹀彉鍖?
鐢變簬 B(T) in {0, D, 2D} => H(T) = H(2) + D
鑻?B(n) != D' => B(N) = B(T) => H(N) = H(T) + D = H(2) + 2D -+
鑻?B(n) == D' => B(P) = 0 -+ |
B(T) = B(t) + 2D + |
B(N) = B(n) + B(T) + B(P) -+ +
|
=> B(N) = B(t) + D => H(N) = H(T) + D |
= H(2) + 2D -+
=> H(N) = H(2) + 2D -+
H(p) = / H(2) + 2D 褰?B(t) == 0 + =>
\ H(2) + 3D 褰?B(t) != 0 -+
H(N) - H(p) = / 0 褰?B(t) == 0
\ -D 褰?B(t) != 0
5. 鏃嬭漿鏂瑰紡(Right-Left)
a. 鏃嬭漿鍓嶇殑鏍戠粨鏋勫拰鍑芥暟鏂圭▼濡備笅:
娉? 鍥犳棆杞柟寮忎笌 (Left-Right) 宸﹀彸瀵圭О, 鎵浠ユ帹鐞嗘柟娉曠浉鍚? 鏁呯渷鐣ユ帹鐞嗚繃紼?/span>
(p) B(p) = H(1) - H(t) = 2D'
/ \
(1) (t) B(t) = H(n) - H(2)
/ \
(n) (2) B(n) = H(3) - H(4)
/ \
(3) (4) 鍚屾椂蹇呭畾瀛樺湪: B(t) != D', 鍙互鐢ㄥ弽璇佹硶璇佹槑.
b. 鏃嬭漿鍚庣殑鏍戠粨鏋勫拰鍑芥暟鏂圭▼濡備笅: (娉? 緇撶偣 p, t, n 鏃嬭漿鍚庡垎鍒畾涔変負 P, T, N)
( N ) B(N) = H(T) - H(P)
/ \ B(P) = H(1) - H(3)
(P) (T) B(T) = H(4) - H(2)
/ \ / \
(1) (3) (4)(2) 鍚屾椂蹇呭畾瀛樺湪: B(P) != D', 鍙互鐢ㄥ弽璇佹硶璇佹槑.
c. B(T) 鍏紡
B(T) = / t.Balance + 2D'褰?B(n) == D
\ t.Balance + D' 褰?B(n) != D
d. B(P) 鍏紡
B(P) = / D 褰?B(n) == D'
\ 0 褰?B(n) != D'
e. B(N) 鍏紡
B(N) = n.Balance + B(P) + B(T)
f. H(N) - H(p) 鍏紡 (鍗寵皟鏁村悗鐨勯珮搴﹀彉鍖?
H(N) - H(p) = / 0 褰?B(t) == 0
\ -D 褰?B(t) != 0
6. 鏃嬭漿鏂瑰紡(Right-Right)
a. 鏃嬭漿鍓嶇殑鏍戠粨鏋勫拰鍑芥暟鏂圭▼濡備笅:
娉? 鍥犳棆杞柟寮忎笌 (Left-Left) 宸﹀彸瀵圭О, 鎵浠ユ帹鐞嗘柟娉曠浉鍚? 鏁呯渷鐣ユ帹鐞嗚繃紼?/span>
(p) B(p) = H(1) - H(t) = 2D'
/ \
(1) (t) B(t) = H(2) - H(n)
/ \
(2) (n) B(n) = H(3) - H(4)
/ \
(3) (4) 鍚屾椂蹇呭畾瀛樺湪: B(t) != D, 鍙互鐢ㄥ弽璇佹硶璇佹槑.
b. 鏃嬭漿鍚庣殑鏍戠粨鏋勫拰鍑芥暟鏂圭▼濡備笅: (娉? 緇撶偣 p, t, n 鏃嬭漿鍚庡垎鍒畾涔変負 P, T, N)
( T ) B(T) = H(P) - H(N)
/ \ B(P) = H(1) - H(2)
(P) (N) B(N) = H(3) - H(4)
/ \ / \
(1) (2) (3)(4) 鍚屾椂蹇呭畾瀛樺湪: B(P) != D, 鍙互鐢ㄥ弽璇佹硶璇佹槑.
c. B(N) 鍏紡
B(N) = B(n) = n.Balance
d. B(P) 鍏紡
B(P) = D' - B(t) = D' - t.Balance
e. B(T) 鍏紡
B(T) = B(t) - D' = t.Balance - D'
f. H(T) - H(p) 鍏紡 (鍗寵皟鏁村悗鐨勯珮搴﹀彉鍖?
B(T) = B(t) - D' => B(T) != D'
=> H(T) = H(P) + D -+
H(P) = / H(1) + 2D 褰?B(P) == D' +
\ H(1) + D 褰?B(P) == 0 -+
=> H(T) = / H(1) + 3D 褰?B(P) == D' -+
\ H(1) + 2D 褰?B(P) == 0 |
+ =>
H(p) = H(t) + D \ |
H(t) = H(1) + 2D / => H(p) = H(1) + 3D -+
H(T) - H(p) = / 0 褰?B(P) == D'=> B(t) == 0
\ -D 褰?B(P) == 0 => B(t) != 0
7. 澧?鍒犵粨鐐圭殑瑕佺偣鍒嗘瀽
a. 鎻掑叆緇撶偣
鎻掑叆緇撶偣娌跨潃鏍圭粨鐐瑰悜涓婂鍔犲鉤琛″? 鑻ユ嫻嬪埌 p 涓?2D 鎴?2D' 鏃? 鍙浣跨敤 LL,
LR, RL, 鎴?RR 涓殑涓縐嶆棆杞皟鏁村鉤琛″? 涓斿彧瑕侀渶瑕佷竴嬈″嵆鍙茍涓鍚戜笂澧炲姞騫寵 鍊?
b. 鍒犻櫎緇撶偣
1). 鐢變簬 LR 鏃嬭漿, 鑻?B(t) == 0 涓?B(n) == D' 鏃? 鍒欏瓨鍦?B(T) = 2D 鍗沖け鍘誨鉤
琛? 鎵浠ュ湪鍒犻櫎緇撶偣鑻ラ亣鍒?B(t) == 0 鏃跺氨鏀逛負 LL 鏃嬭漿鍗沖彲閬垮紑 B(T) = 2D;
2). 鐢變簬 RL 鏃嬭漿, 鑻?B(t) == 0 涓?B(n) == D 鏃? 鍒欏瓨鍦?B(T) = 2D' 鍗沖け鍘誨鉤
琛? 鎵浠ュ湪鍒犻櫎緇撶偣鑻ラ亣鍒?B(t) == 0 鏃跺氨鏀逛負 RR 鏃嬭漿鍗沖彲閬垮紑 B(T) = 2D';
3). 鍒犻櫎緇撶偣娌跨潃鏍圭粨鐐瑰悜涓婂噺鍘誨鉤琛″? 鑻ユ嫻嬪埌 p 涓?2D 鎴?2D' 鏃? 鍙浣跨敤
LL, LR, RL, 鎴?RR 涓殑涓縐嶆棆杞皟鏁村鉤琛″? 褰?B(t) == 0 鏃朵腑姝㈠悜涓婂噺鍘誨鉤
琛″? 鍚﹀垯蹇呴』鍚戜笂鍑忓幓騫寵 鍊?