Cây nhị phân tìm kiêm
(BST — Binary Search Tree)
!_ Ý nghĩa của cây BST
! Ví dụ
! Mô tả câu trúc dữ liệu
! Xây dựng các thao tác cơ bản trên cây
| Trac nghiém
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 43
Cây nhị phân tìm kiêm
Ý nghĩa của cây BST
!_ Điêm yêu và điêm mạnh của việc sử dụng
mảng ?
!_ Điêm yêu và điêm mạnh của việc sử dụng
danh sách liên kêt ?
mạnh của cả mảng và danh sách liên kêt
phân tử ?
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT BH KHTN Tp.HCM 44
22
Trang 2Cây nhị phân tìm kiêm
Định nghĩa
!_ Cây nhị phân tìm kiếm là:
!_ Một cây nhị phân
! Mỗi nút p của cây đều thỏa:
| Tat cả các nút thuộc cây con trái (p->pLeft) đều
có giá trị nhỏ hơn giá trỊ của p
| Tat ca cac nut thudc cay con phai (p->pRight) déu co gia tri lén hon gia tri của p
Vq € p->pRight: gq->Data > p->Data
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 45
Cây nhị phân tìm kiêm
Ví dụ
ẹ 22 ~~ ae 19 Cs) Gs») —
5 ề 1s
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 46
Trang 3Cây nhị phân tìm kiêm
Ví dụ
(b)
i 159 33 C143
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT BH KHTN Tp.HCM
22
47
Cây nhị phân tìm kiêm
Mô tả câu trúc đữ liệu
phân
! Xem lai phan “Tổng quan về cây nhị phân
- Cách thức lưu trữ cây”
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT BH KHTN Tp.HCM 48
24
Trang 4Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
| Cac thao tac trén cay BST:
!_ Tạo lập cây rỗng
| Kiém tra cây rỗng
| Tim kiém 1 phan ttr
| Thém 1 phan tir
! Xóa 1 phần tử
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 49
Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
!_ Tạo lập cây rỗng:
voidd BSTCreate(BIN TREE &t)
{
t.Count = 0; /! Số nút trong cây t.pRoot = NULL; // Con trỏ đến nút gốc
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 50
Trang 5Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
! Kiểm tra cây rỗng:
int BSTIsEmpty(const BIN_TREE &t)
{
if (t.pRoot==NULL) return 1;
return 0;
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 51
Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
| Vi du tim kiém phan tir 25:
Z4 40 NK
|| 24 36 | 75
\
30
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT BH KHTN Tp.HCM 52
26
Trang 6Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
| Vi du tim kiém phan ttr “Nancy”:
<>
C Tem 2
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 53
Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
!_ Ví dụ tìm kiếm phân tử 31:
pRoot
wo)
Na
Ý
| |24 36 | 75
30 | | _——Í NUUU không tìm thay |
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT BH KHTN Tp.HCM 54
Trang 7Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
! _ Tìm kiếm I phân tử:
BT_NODE *BSTSearch(const BT_NODE *pCurr, int Key)
{
if (pCurr==NULL) return NULL; _// Khong tim thay
if (pCurr->Data==Key) return pCurr; // Tim thay else if (pCurr->Data > Key) // Tim trong cay con trai
return BSTSearch(pCurr->pLeft, Key);
else // Tim trong cay con phai return BSTSearch(pCurr->pRight, Key);
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 55
Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
| Vi du thém phân tử “Frank”:
NULL, kết thúc tìm kiếm ở đây
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 56
28
Trang 8
Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 57
Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
| Vi du thém phan tir 26:
pRoot
r40
|| 24 36 ,|75
\
NULL, kết thúc tim 30
kiêm ở đây
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT BH KHTN Tp.HCM 58
Trang 9Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
| Vi du thém phan tir 26:
pRoot
„| 40 | -
x⁄ a
⁄
26 30
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT BH KHTN Tp.HCM 59
Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
| Vi du thém phan tir 27:
pRoot
r40
\
không thêm nữa
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT BH KHTN Tp.HCM 60
30
Trang 10Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
| Thém 1 phan tir:
int BSTInsert(BT_NODE *&pCurr, int newKey)
{ if (pCurr==NULL) {
pCurr = new BT_NODE; // Tạo I nút mới
pCurr->Data = newKey; pCurr->pLeft = pCurr->pRight = NULL;
}
if (pCurr->Data > newKey) // Thém vao cay con trai
return BSTInsert(pCurr->pLeft, newKey);
else if (pCurr->Data < newKey) // Thêm vào cây con phải
return BSTInsert(pCurr->pRight, newKey);
else return 0; // Trùng khóa, không thêm nữa
}
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 61
Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
!_ Thao tác xóa 1 phân tử:
| Ap dung giải thuật tìm kiếm để xác định nút
chứa phân tử cần xóa
! Nếu tìm thấy, xóa phân tử đó khỏi cây
!_ Các trường hợp xảy ra:
I_ Xóa I nút không có nút con
I_ Xóa I nút có ] nút con
I_ Xóa Ï nút có 2 nút con
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 62
Trang 11Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
!_ Ví dụ xóa phân tử 4 (không có nút con)
„| 40 |x
„ |40)| - I—>
J3J| (6s) /ến
4
= 25 70
25 70
Gán liên kết ở nút
cha thanh NULL
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 63
Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
! Ví dụ xóa phân tử 25 (chỉ có nút con phải)
x
30
liên kết = nút con phải
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 64
Trang 12
Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
! oa Ï nút chỉ có nút con phải:
#4 SN
+ *
Trước khi xóa pCurr Sau khi xóa pCurr
P->pLeft = pCurr->pRight;
delete pCurr;
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 65
Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
! Ví dụ xóa phân tử 75 (chỉ có nút con trái) í lênkết=
nút con trái
5V 0Š» x2”
Fá
\ \
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 66
Trang 13
Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
I_ Xoá 1 nut chi có nút con trái:
pCurr Z¡
¢
Trước khi xóa pCurr Sau khi xóa pCurr
P->pRight = pCurr->pLeft;
delete pCurr;
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 67
Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
!_ Ví dụ xóa phân tử 40 (có 2 nút con)
L | 40),
J24|| | 136 ,|75 IE—>
4 25} | 70
%
30
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT BH KHTN Tp.HCM 68
34
Trang 14Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
!_ Xóa phân tử 40 (có 2 nút con):
Cách 1: thay thê 36
nhất trong cây con we / / | 32 6° N
\
30
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 69
Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
!_ Xóa phân tử 40 (có 2 nút con):
Cách 2: thay thê 65
\
30
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT BH KHTN Tp.HCM 70
Trang 15Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
! Xóa 1 phần tử pCurr có 2 nút con:
| Thay vì xóa trực tiếp nút pCurr
| .ta tim 1 phan tt thay thé p,
! ,.copy ndi dung cua p sang pCurr,
! .x6a nut p
| Phan tir thay thé p:
¡ là phần tử lớn nhất trong cây con bên trái; hoặc
¡ là phần tử nhỏ nhất trong cây con bên phải
phần tử p có nhiều nhất 1a 1 nut con
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 71
Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
! Xóa 1 phân tử:
int BSTDelete(BT_NODE *&pCurr, int Key)
{ if (pCurr==NULL) return 0; // Khong tìm thấy phần tử
if (pCurr->Data > Key) // X6a trén cay con trai
return BSTDelete(pCurr->pLeft, Key);
else if (pCurr->Data < Key) // X6a trên cây con phải
return BSTDelete(pCurr->pRight, Key);
// Tìm thấy nút cần xóa pCur Xóa ! _Delete(pCurr);
return 1;
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 72
36
Trang 16Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
| X6a 1 phan tt (tt) :
void _Delete(BT_NODE *&pCurr)
{
BT_NODE *pTemp = pCurr;
if (pCurr->pRight==NULL) // Chi c6 1 nut con trái
pCurr = pCurr->pLeft; // Lưu lại nhánh con trái else if (pCurr->pLeft==NULL)
pCurr = pCurr->pRight; // Luu lai nhanh con phai
pTemp = _ SearchStandFor(pCurr->pLeft, pCurr);
delete pTemp;
}
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT BH KHTN Tp.HCM 73
Cây nhị phân tìm kiêm
Xây dựng các thao tác cơ bản trên cây
I Xóa phần tử (tt) :
// Tìm phần tử thay thế: “Phần tử lớn nhất trong cây con bên trái”
BT_NODE * _SearchStandFor(BT_NODE *&p, BT_NODE *pCurr)
{
if (p->pRight != NULL)
return _SearchStandFor(p->pRight, pCurr);
// Tim thay phan tir thay thé
pCurr->Data = p->Data; // Copy dữ liệu của p vào pCurr
BT_NODE *pTemp = p;
}
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 74
Trang 17Cây nhị phân tìm kiêm
Các đánh giá
I Cây có N nút sẽ có độ cao trong khoảng từ
[log,(N+1)] dén N
| Trac nghiém: khi nao độ cao của cây nhỏ nhất ? Lớn
nhât ?
! So sánh giữa cây BST với mảng được sắp thứ tự:
| C6 cing chi phi tim kiém O(log,N)
! Cay BST có chi phi thêm 1 phan tir O(log,N); mang c6
chi phi thém | phan tu O(N)
!_ Tương tự đối với thao tác xóa I phần tử
¡_ Cây BST tốn nhiều bộ nhớ lưu trữ hơn
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 75
Cây nhị phân tìm kiêm
Trắc nghiệm
| Viet ham “Tim phan tir thay the: Phan tu nho
nhát trong cây con bên phải ”
! Bài tập #20
! Bài tập #22
! Bài tập #36
| Bai tap #31
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT DH KHTN Tp.HCM 76
38