Professional Documents
Culture Documents
8 3 5 2 20 11 30 9 18 4
8 8 8 8
3 3 3
5 2 5
Tạo cây nhị phân tìm kiếm với các khóa nhập vào theo thứ tự
8 3 5 2 20 11 30 9 18 4
8 8 8
3 20 3 20 3 20
2 5 2 5 11 2 5 11 30
1
Tạo cây nhị phân tìm kiếm với các khóa nhập vào theo thứ tự
8 3 5 2 20 11 30 9 18 4
8 8
3 20 3 20
2 5 11 30 2 5 11 30
9 9 18
Tạo cây nhị phân tìm kiếm với các khóa nhập vào theo thứ tự
8 3 5 2 20 11 30 9 18 4
3 20
2 5 11 30
4 9 18
2
Hủy nút 5, 20
8 8
3 20 3 20
2 5 11 30 2 4 11 30
4 9 18 9 18
Hủy nút 5, 20
8 8
3 20 3 30
2 4 11 30 2 4 11
9 18 9 18
Nút 20 có 2 cây con, chọn nút thay thế là nút trái nhất của cây
con bên phải:
- Chọn nút thay thế q là 30.
- Gán giá trị khóa 30 cho nút 20.
- Hủy nút thay thế q
3
Tạo cây nhị phân tìm kiếm cân bằng với các khóa nhập vào
theo thứ tự 5 7 2 1 3 6 10
0 1 0 -1
5 5 5 5
0 0 0 -1 0
7 2 7 2 7
0
1
-1 0 0
5 5 5
0 0 0 -1 0 0
2 7 2 7 2 7
0 0 0 0 0 0 0 0 0
1 3 1 3 6 1 3 6 10
0 0
5 6
0 0 0 1
2 7 2 7
0 0 0 0 0 0 0
1 3 6 10 1 3 10
Hủy nút 5: Nút 5 có hai cây con, chọn nút thay thế là nút trái
nhất của cây con bên phải:
- Chọn nút thay thế q = 6.
- Gán khóa 6 cho nút 5.
- Chỉ số cân bằng tại 7 là 1 nếu xóa q → chưa cần cân bằng
lại.
- Hủy nút không làm thay đổi chiều cao tại 7.
- Hủy nút q.
4
Hủy lần lượt các nút 5, 6, 7, 10
0 -1
6 7
0 1 0 0
2 7 2 10
0 0 0 0 0
1 3 10 1 3
Hủy nút 6: Nút 6 có hai cây con, chọn nút thay thế là nút trái
nhất của cây con bên phải:
- Chọn nút thay thế q = 7.
- Gán khóa 7 cho nút 6.
- chiều cao cây thay đổi tại 7 nếu xóa q → cập nhật chỉ số
cân bằng về nút gốc.
- Hủy nút q.
7 10 2
0 0 0 0 -1
2 10 2 1 10
0 0 0 0 0
1 3 1 3 3
Hủy nút 7: Nút 7 có hai cây con, chọn nút thay thế là nút trái
nhất của cây con bên phải:
- Chọn nút thay thế q = 10.
- Gán khóa 10 cho nút 7.
- Chiều cao cây thay đổi tại 10 nếu xóa q → cập nhật chỉ số
cân bằng về nút gốc.
- Chỉ số cân bằng tại gốc là -1, hủy nút phải làm chỉ số cân
bằng thành -2 → cân bằng lại bên trái.
- Hủy nút q.
5
Hủy lần lượt các nút 5, 6, 7, 10
1 0
2 2
0 -1 0 0
1 10 1 3
0
int GetLeafNum(TREE T) {
int n = 0;
if (T == NULL)
return 0;
if ((T->pLeft == NULL) && (T->pRight == NULL))
return 1;
if (T->pLeft)
n = GetLeafNum(T->pLeft);
if (T->pRight)
n = n + GetLeafNum(T->pRight);
return n;
}
6
Tính số nút có đúng một cây con
int GetSNodeNum(TREE T) {
int n;
if (T == NULL)
return 0;
if ((T->pLeft == NULL) && (T->pRight == NULL))
return 0;
if ((T->pLeft) && (T->pRight))
n = 0;
else
n = 1;
n = n + GetSNodeNum(T->pLeft) +
GetSNodeNum(T->pRight);
return n;
}
int GetDNodeNum(TREE T) {
int n;
if (T == NULL)
return 0;
if ((T->pLeft == NULL) && (T->pRight == NULL))
return 0;
if ((T->pLeft) && (T->pRight))
n = 1;
else
n = 0;
n = n + GetDNodeNum(T->pLeft) +
GetDNodeNum(T->pRight);
return n;
}
7
Tính số nút có khóa nhỏ hơn x trong cây nhị phân tìm kiếm T
Tính số nút có khóa lớn hơn x trong cây nhị phân tìm kiếm T
8
Tính số nút có khóa lớn hơn x và nhỏ hơn y trong cây nhị
phân tìm kiếm T
int GetHeight(TREE T) {
int hl, hr;
if (T == NULL)
return 0;
hl = GetHeight(T->pLeft);
hr = GetHeight(T->pRight);
if (hl < hr)
return hr + 1;
else
return hl + 1;
}
9
Kiểm tra cây nhị phân tìm kiếm T có phải là
cây cân bằng hoàn toàn hay không (Độ lệch
giữa chiều cao cây con trái và cây con phải
không quá 1 và độ lệch giữa số nút của cây
con trái và cây con phải không quá 1)
int CheckCompletelyBal(TREE T) {
int hl, hr, nl, nr;
if (T == NULL)
return 1;
if (!CheckCompletelyBal(T->pLeft))
return 0;
if (!CheckCompletelyBal(T->pRight))
return 0;
hl = GetHeight(T->pLeft);
hr = GetHeight(T->pRight);
nl = GetNodeNum(T->pLeft);
nr = GetNodeNum(T->pRight);
if (((hl == hr + 1) || (hr == hl + 1)) &&
((nl == nr + 1) || (nr == nl + 1)))
return 1;
else
return 0;
}
10
Tính độ lệch về chiều cao lớn nhất trên cây nhị phân T
int GetMaxDiff(TREE T) {
int hl, hr, dl, dr, d;
if (T == NULL) return 0;
dl = GetMaxDiff(T->pLeft);
dr = GetMaxDiff(T->pRight);
if (dr < dl) d = dl;
else d = dr;
hl = GetHeight(T->pLeft);
hr = GetHeight(T->pRight);
if (hr - hl > d)
d = hr - hl;
if (hl - hr > d) // vì không dùng hàm abs
d = hl - hr;
return d;
}
11