You are on page 1of 11

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 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

Nút 5 có 1 cây con:


- Lấy cây con duy nhất có khóa 4 làm cây con của 3
- Hủy nút có khóa 5.

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

Hủy lần lượt các nút 5, 6, 7, 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.

Hủy lần lượt các nút 5, 6, 7, 10


-1 -2 1

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

Hủy nút 10: Nút 10 có một cây con


- Gán cây con duy nhất 3 làm cây con của 2.
- Chiều cao cây tại nút 10 thay đổi → cập nhật lại chỉ số cân
bằng về nút gốc.
- Hủy nút q.

Tính số nút lá của cây nhị phân T

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;
}

Tính số nút có đúng hai cây con

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

int GetNodeNum(TREE T); // hàm này được cài đặt ở dưới


int GetSmallerNodeNum(TREE T, int x) {
int n;
if (T == NULL)
return 0;
if (T->key < x) {
n = 1 + GetNodeNum(T->pLeft) +
GetSmallerNodeNum(T->pRight, x);
}
else {
n = GetSmallerNodeNum(T->pLeft, x);
}
return n;
}

Tính số nút có khóa lớn hơn x trong cây nhị phân tìm kiếm T

int GetBiggerNodeNum(TREE T, int x) {


int n;
if (T == NULL)
return 0;
if (T->key > x) {
n = 1 + GetBiggerNodeNum(T->pLeft, x);
GetNodeNum(T->pRight, x);
}
else {
n = GetBiggerNodeNum(T->pRight, x);
}
return n;
}

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 GetRangeNodeNum(TREE T, int x, int y) {


int n = 0;
if (T == NULL) return 0;
if (T->key < x) n = GetRangeNodeNum(T->pRight, x, y);
else
if (T->key > y ) n = GetRangeNodeNum(T->pLeft, x, y);
else {
if ((T->key != x) && (T->key != y))
n = 1;
n = n + GetRangeNodeNum(T->pLeft, x, y) +
GetRangeNodeNum(T->pRight, x, y);
}
return n;
}

Tính chiều cao cây nhị phân 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 GetNodeNum(TREE T) { // hàm tính số nút


được cài đặt
if (T == NULL)
return 0;
return 1 + GetNodeNum(T->pLeft) +
GetNodeNum(T->pRight);
}

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

You might also like