Cây tìm kiếm nhị phân binary search tree Cây tìm kiếm nhị phân TKNP là cây nhị phân mà khoá tại mỗi nút lớn hơn khoá của tất cả các nút thuộc cây con bên trái và nhỏ hơn khoá của tất
Trang 1Phần 2: Các giải thuật nâng cao
Chương 3: Cây cân bằng Balanced trees
PGS TS TRẦN CAO ĐỆ Đại Học Cần Thơ
2013
Trang 2Cây tìm kiếm nhị phân
binary search tree
Cây tìm kiếm nhị phân
(TKNP) là cây nhị phân mà khoá tại mỗi nút lớn hơn khoá của tất cả các nút thuộc cây con bên trái và nhỏ hơn khoá của tất cả các nút thuộc cây con bên phải.
typedef <kiểu dữ liệu của khoá> KeyType;
typedef struct Node{
15
35
37
Trang 3thêm một khoá vào cây TKNP
void InsertNode(KeyType x,Tree& Root ){
/* thêm nút mới chứa khoá x */
15
35
37
Trang 415
Trang 5Xóa một nút trên cây TKNP
KeyType DeleteMin (Tree& Root ){
else if (x > Root->Key) DeleteNode(x,Root->Right);
else if ((Root->Left==NULL) && (Root->Right==NULL)) Root=NULL; else
if (Root->Left == NULL) Root = Root->Right;
else if (Root->Right==NULL) Root = Root->Left;
else Root->Key = DeleteMin(Root->Right);
}
Trang 6Phân tích BST
Tìm kiếm một nút trên cây TKNP
– Mất O(1) duyệt trên mỗi nút
– Mỗi lần duyệt đi sâu xuống một mức
– Vậy thời gian tìm kiếm là O(h) với h là chiều cao của cây
Thời gian tìm kiếm 1 nút, thêm một nút, xóa một nút trên cây TKNP là O(h), với h là chiều cao của cây TKNP
Chiều cao của cây TKNP có n nút: Logn ≤ h ≤ n
Trang 7Cây AVL
Trong trường hợp xấu nhất
thời gian thực hiện các phép toán trên BST là O(n)
Cân bằng AVL
– Do Adelson Velski và Landis
– AVL: Cây TKNP mà chiều cao của hai cây con của mọi nút chênh lệch nhiều nhất là 1
Trên cây AVL các phép tìm
kiếm, thêm, xoa một nút là
2 h/2+1 – 1 < n h/2 +1 < log 2 (n + 1)
h < 2 log 2 (n + 1)
Phân tích sâu sắc theo số Fibonacci, giới
hạn trên là 1.44 log(n + 2)
Trang 8Thêm một nút vào cây AVL
Đầu tiên thêm một nút vào cây TKNP Cây có thể mất cân bằng.
Cân bằng lại
– Xét cây AVL: tree T=(r,Tl,Tr) trong đó Tl có chiều cao hl và
Tr có chiều cao hr
– Giả sử nút thêm vào trên Tr.
Nếu hl=hr+1: sau khi thêm vẫn cân bằng
Nếu hl=hr : sau khi thêm vẫn cân bằng
Nếu hl=hr-1 thì sau khi thêm sẽ mất cân bằngcân bằng lại
– Tương tự nếu thêm nút vào Tl
Trang 9Single Rotation-RR
RR rotation
Trang 10Single rotation
LL
LL
Trang 11Double rotation-LR
LR
Trang 12Double rotation-RL
RL
Trang 13Các định lý
4 phép quay LL, RR, LR, và RL phủ toàn bộ các trường hợp cần phải cân bằng lại
Trường hợp cây AVL trở nên mất cân bằng khi thêm một nút chỉ cần một phép quay để làm cho cây cân bằng lại.
Trường hợp cây AVL trở nên mất cân bằng
khi Xóa một nút có thể cần tới O(log n) phép
quay để làm cho cây cân bằng lại (từ nút mất cân bằng đến gốc).
Trang 15Xóa nút 4
4
Trang 16AVL Trees Implementation in java
See 3.6.1 chapter 3, Algorithm design, Goodrich
Trang 17d-cây
Cây đa phân: là cây mỗi nút có
từ hai con trở lên
Cây có thứ tự: các nút có tt
Nút v là d-nút: V có d≥2 nút con
Cây tìm kiếm đa phân
(multi-way search tree) là cây có thứ
tự với các tính chất sau:
– Mỗi nút trong là một d-nút có ít nhất 2 nút con.
– Mỗi nút lưu trữ một tập hợp các phần tử dạng (k,x),
k là khóa
x là giá trị kết hợp với khóa
Mỗi d-nút (có các nút con
v1, ,vd) sẽ lưu d-1 phần tử dạng (k1,x1), …, (kd-1,xd-1) và mỗi phần tử (k,x) lưu trong cây con gốc vi phải thỏa mãn: ki-1 ≤ k < ki
( k0= -∞ còn kd = +∞)
Định lý: cây tìm kiếm đa phân chứa n phần tử
có (n+1) nút ngoài
Trang 18B-Cây trong giáo trình GT của Nguyễn Văn Linh
Trang 19Cây 2-3-4 hoặc cây (2,4)
Cây (2,4) là 4-cây cân
bằng:
– Mỗi nút có tối đa 4 nút con
– Các nút lá cùng một độ sâu
Trang 203, 4
5, 12
156,10
Trang 21 Ta luôn có thể giả sử phần tử bị xóa nằm tại nút v là lá
Nếu phần tử bị xóa là pt thứ i của nút z, tức là (ki,xi), là nút trong, ta đổi (ki,xi) với một phần tử thích hợp:
– Tìm nút cực phải trên cây con thứ i của z, gọi đó là nút v
– Đổi chổ (ki,xi) với phần tử cuối cùng của v
Việc xóa như trên:
– bảo toàn độ sâu
– Không bảo toàn điều kiện về số phần tử
chuyển phần tử từ anh em (3-nút, 4-nút) sang, hoặc
Kết hợp 2 nút
Trang 24Hiệu quả của cây (2,4)
Thêm, xóa, tìm một phần tử với thời gian O(logn)
Trang 25Cây đỏ-đen
red – black trees
Cây đỏ đen là cây TKNP với các nút được tô màu
số nút đen tiền bối)
Định lý: Cây đỏ-đen chứa n nút sẽ có độ cao O(Logn)
Trang 27Tương đương giữa cây đỏ đen và cây (2,4)
Trang 29Thêm một phần tử vào cây đỏ đen
Thêm phần tử có khóa x vào cây đỏ đen
– Tìm kiếm và thêm vào cây TKNP
– Tô màu: Đen nếu là ROOT, Đỏ ngược lại
– Như vậy:
Tính chất cân bằng “đen” bảo toàn
Tính chất nút đỏ có thể bị vi phạm : Cha nút mới có thể
là nút đỏ (double red)
– Gọi z là nút mới thêm, v là cha của z: Nếu v là nút
đỏ thì cha của v là u phải là nút đen Gọi w là sibling của v.
Trang 30double red: Tô màu lại
Trường hợp 1: w là nút đen
10z
a,b,c là 3 nút theo thứ tự duyệt trung tự
Trang 31double red: Tô màu lại
Trường hợp 1: w là nút đỏ
10z
u
3020
Trang 34Ví dụ: đưa các nút 4,7,12, 15, 3, 5, 14, 18, 16,
17 vào cây đỏ đen
74
Trang 3617
Trang 3717
Trang 38RB-INSERT(T, x){
BST-TREE-INSERT(T, x)
color[x] ← RED //only RB property 3 can be violated
while (x ≠ root[T] and color[p[x]] = RED) do {
Trang 39Case 1
Là một cây đỏ đen hợp lệ (Gốc đen, các nhánh đều có cùng số nút đen)
Trang 40Case 2, 3
Trang 41Định lý
Thêm một phần tử vào cây đỏ đen chứa n nút cần O(logn) phép recoloring và O(1) phép quay để cấu trúc lại cây.
Trang 42Xóa một nút trên cây đỏ đen
Tìm kiếm và xóa phần tử trên cây TKNP
– Ta luôn xóa nút lá hoặc nút chỉ có 1 nút con
– Gọi v là nút bị xóa, w là nút con ngoài của v, r là nút anh em của w, x là nút cha của v
Xóa v và w, cho r là con của x
Trang 44 Nếu v đen và r cũng đen:
– Sau khi xóa thì r được đặt màu “giả” double-black)
– Cấu trúc lại bộ 3 nút ( 3-nodes restructuring)
Trang 45Trường hợp 1: nút y anh em của r là đen, nút y có một con màu đỏ (z) Gọi a,b,c là ba nút x,y,z theo thứ tự duyệt trung tự
Trang 46Trường hợp 2: nút y anh em của r là đen, nút y có hai
Trang 47Nếu x đen, tô màu lại thì x trở thành double
Trang 48Trường hợp 3: nút y anh em của r màu đỏ
Adjustment: IF (y == right(x)) THEN z=right(y)
Then, apply case 1 or case 2 without reappearing double black
Trang 5314
54
714
54
7
recoloring
Trang 54Red Black Trees Implementation in java
See 3.6.1 chapter 3, Algorithm design,
Goodrich