2. CấutrúcdữliệuvàthuậtgiảiCẤUTRÚCDỮLIỆUVÀGIẢITHUẬT1 Click To Edit Master Title Style
2
Ðịnh nghĩa cây nhị phân tìm kiếm
• Cây nhị phân
• Bảo đảm nguyên tắc bố trí khoá tại mỗi nút:
– Các nút trong cây trái nhỏ hơn nút hiện hành
– Các nút trong cây phải lớn hơn nút hiện hành
18
13 37
15 23 40
Ví dụ:
3. CấutrúcdữliệuvàthuậtgiảiCẤUTRÚCDỮLIỆUVÀGIẢITHUẬT1 Click To Edit Master Title Style
3
Ưu điểm của cây nhị phân tìm kiếm
• Nhờ trật tự bố trí khóa trên cây :
–Định hướng được khi tìm kiếm
• Cây gồm N phần tử :
–Trường hợp tốt nhất h = log2N
–Trường hợp xấu nhất h = Ln
–Tình huống xảy ra trường hợp xấu nhất ?
4. CấutrúcdữliệuvàthuậtgiảiCẤUTRÚCDỮLIỆUVÀGIẢITHUẬT1 Click To Edit Master Title Style
4
Cấu trúc dữ liệu của cây nhị phân tìm kiếm
• Cấu trúc dữ liệu của 1 nút
typedef struct tagTNode
{
int Key; //trường dữ liệu là 1 số nguyên
struct tagTNode *pLeft;
struct tagTNode *pRight;
}TNode;
• Cấu trúc dữ liệu của cây
typedef TNode *TREE;
5. CấutrúcdữliệuvàthuậtgiảiCẤUTRÚCDỮLIỆUVÀGIẢITHUẬT1 Click To Edit Master Title Style
5
Các thao tác trên cây nhị phân tìm kiếm
Tạo 1 cây rỗng
Tạo 1 nút có trường Key bằng x
Thêm 1 nút vào cây nhị phân tìm kiếm
Xoá 1 nút có Key bằng x trên cây
Tìm 1 nút có khoá bằng x trên cây
7. CấutrúcdữliệuvàthuậtgiảiCẤUTRÚCDỮLIỆUVÀGIẢITHUẬT1 Click To Edit Master Title Style
7
Tạo 1 nút có Key bằng x
TNode *CreateTNode(int x)
{
TNode *p;
p = new TNode; //cấp phát vùng nhớ động
if(p==NULL)
exit(1); // thoát
else
{
p->key = x; //gán trường dữ liệu của nút = x
p->pLeft = NULL;
p->pRight = NULL;
}
return p;
}
8. CấutrúcdữliệuvàthuậtgiảiCẤUTRÚCDỮLIỆUVÀGIẢITHUẬT1 Click To Edit Master Title Style
8
Thêm một nút x
• Rằng buộc: Sau khi thêm cây đảm bảo là cây
nhị phân tìm kiếm.
int insertNode(TREE &T, Data X)
{ if(T)
{ if(T->Key == X) return 0;
if(T->Key > X) return insertNode(T->pLeft, X);
else return insertNode(T->pRight, X);}
T = new TNode;
if(T == NULL) return -1;
T->Key = X;
T->pLeft =T->pRight = NULL;
return 1;
}
14. CấutrúcdữliệuvàthuậtgiảiCẤUTRÚCDỮLIỆUVÀGIẢITHUẬT1 Click To Edit Master Title Style
14
Hủy 1 nút có khoá bằng X trên cây
Hủy 1 phần tử trên cây phải đảm bảo điều kiện
ràng buộc của Cây nhị phân tìm kiếm
Có 3 trường hợp khi hủy 1 nút trên cây
TH1: X là nút lá
TH2: X chỉ có 1 cây con (cây con trái hoặc cây con phải)
TH3: X có đầy đủ 2 cây con
TH1: Ta xoá nút lá mà không ành hưởng đến các
nút khác ttrên cây
TH2: Trước khi xoá x ta móc nối cha của X với con
duy nhất cùa X.
TH3: Ta dùng cách xoá gián tiếp
16. CấutrúcdữliệuvàthuậtgiảiCẤUTRÚCDỮLIỆUVÀGIẢITHUẬT1 Click To Edit Master Title Style
16
Hủy 1 nút có 2 cây con
Ta dùng cách hủy gián tiếp, do X có 2 cây con
Thay vì hủy X ta tìm phần tử thế mạng Y. Nút Y có
tối đa 1 cây con.
Thông tin lưu tại nút Y sẽ được chuyển lên lưu tại
X.
Ta tiến hành xoá hủy nút Y (xoá Y giống 2 trường
hợp đầu)
Cách tìm nút thế mạng Y cho X: Có 2 cách
C1: Nút Y là nút có khoá nhỏ nhất (trái nhất) bên
cây con phải X
C2: Nút Y là nút có khoá lớn nhất (phải nhất) bên
cây con trái của X
18. CấutrúcdữliệuvàthuậtgiảiCẤUTRÚCDỮLIỆUVÀGIẢITHUẬT1 Click To Edit Master Title Style
18
Cài đặt thao tác xoá nút có trường Key = x
void DeleteNodeX1(TREE &T,int x)
{
if(T!=NULL)
{
if(T->Key<x) DeleteNodeX1(T->Right,x);
else
{
if(T->Key>x) DeleteNodeX1(T->Left,x);
else //tim thấy Node có trường dữ liệu = x
{ TNode *p;
p=T;
if (T->Left==NULL) T = T->Right;
else
{ if(T->Right==NULL) T=T->Left;
else ThayThe1(p, T->Right);// tìm bên cây con
phải
}
delete p;
}
}
}
else printf("Khong tim thay phan can xoa tu");}