Bài giảng chương 10 : Cây nhị phân tìm kiếm | Cấu trúc dữ liệu và giải thuật

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. Bài giảng giúp bạn tham khảo, củng cố kiến thức và ôn tập đạt kết quả cao

Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
Click To Edit Master Title Style
1
NỘI DUNG
CÂY NHỊ PHÂN TÌM KIẾM
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
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ụ:
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
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 = log
2
N
Trường hợp xấu nhất h = N
Tình huống xảy ra trường hợp xấu nhất ?
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
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;
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
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
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
Click To Edit Master Title Style
6
Tạo cây rỗng
Cây rỗng -> địa chỉ nút gốc bằng NULL
void CreateTree(TREE &T)
{
T=NULL;
}
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
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;
}
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
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 != NULL)
{
if (T->Key == X) return 0;
if (T->Key > X) return insertNode(T->pLeft, X);
else return insertNode(T->pRight, X);
}
T = CreateTNode(X);
return 1;
}
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
Click To Edit Master Title Style
9
Minh họa thêm 1 phần tử vào cây
44
18 88
13 37
59
108
15 23 40 55 71
44 < X
88 > X
59 > X
50
55 > X
insertNode(T, X)
T
Thêm X=50
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
Click To Edit Master Title Style
10
Tìm nút có khoá bằng x (dùng đệ quy)
TNode *SearchTNode(TREE T, int x)
{
if(T!=NULL)
{
if(T->key==x)
return T;
else if(x>T->key)
return SearchTNode(T->pRight,x);
else
return SearchTNode(T->pLeft,x);
}
return NULL;
}
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
Click To Edit Master Title Style
11
Tìm nút có khoá bằng x (không dùng đệ quy)
TNode * searchNode(TREE Root, Data x)
{
Node *p = Root;
while (p != NULL)
{ if(x == p->Key) return p;
else if(x < p->Key) p = p->pLeft;
else p = p->pRight;
}
return NULL;
}
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
Click To Edit Master Title Style
12
Minh hoạ tìm một nút
44
18 88
13 37
59
108
15 23 40 55 71
Tìm X=55
Tìm thấy X=55
55
55
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
Click To Edit Master Title Style
13
Minh hoạ thành lập 1 cây từ dãy số
9, 5, 4, 8, 6, 3, 14,12,13
9
5
14
8
4
6
3
12
13
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
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: Xoá nút lá mà không ảnh hưởng đến các nút
khác trê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: Dùng cách xoá gián tiếp
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
Click To Edit Master Title Style
15
Minh hoạ hủy phần tử x có 1 cây con
44
18 88
13
59
10837
15 23 55 71
Hủy X=37
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
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
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
Click To Edit Master Title Style
17
Minh họa hủy phần tử X có 2 cây con
44
18 88
13 37
59
108
15
23
40 55 71
30
Xoá nút có trường
Key = 18, lúc đó nút có
khoá 23 là nút thế mạng
23
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
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 trường dữ liệu = x
{
TNode *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");
}
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
Click To Edit Master Title Style
19
Hàm tìm phần tử thế mạng
void ThayThe1(TREE &p, TREE &T)
{ if(T->Left!=NULL)
ThayThe1(p,T->Left);
else
{
p->Key = T->Key; // Gán lại giá trị node bi
xoá
p = T; // Trỏ đến node bị xoá thực sự
T = T->Right; //Cô lập node bị xoá
}
}
Cu trúc d liu và thut gii
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
Click To Edit Master Title Style
20
Bài tập
Cài đặt để nhập một danh sách các số
nguyên vào Cây NPTK cho đến khi gặp số 0.
In ra tình trạng cây.
Tìm giá trị X (nhập từ bàn phím) xem có trên
cây hay không?
Nếu có X, hãy xoá nó khỏi cây và in ra tình
trạng cây.
Định nghĩa - Duyệt cây
Tạo cây, node, insert node
Tìm x - Xoá node
| 1/22

Preview text:

Click To Edi N t M ỘI a Dst Uer N T G itle Style i 1iảT CÂY NHỊ PHÂN TÌM KIẾM
Ậ t gUậHuI TIẢ thà GÀ v VuUIỆ liệ LữỮ d DcCÚR trú TuUấẤCC 1 ÐịnC h linck ghĩ T a o E câ d y nit h ịM p a hâst n e tì r m T i ki tl ế e m Style • 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 i 1iảTẬt g 18 Ví dụ:
U ậHuI TIẢ thà GÀ v VuU 13 37 IỆ liệ
L ữỮ d DcCÚR trú TuU
15 23 40 ấẤCC 2 ƯuC đ liick ểm To của Ed câ i y t n M hị a p st hâe n r t ìTi m t le ki ế S m tyle
• 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 = log N 2 i 1iảT
– Trường hợp xấu nhất h = N Ậ t gUậHuI T
– Tình huống xảy ra trường hợp xấu nhất ?
IẢ thà GÀ v VuUIỆ liệ LữỮ d DcCÚR trú TuUấẤCC 3 Cấ C u tlirck úc T d o ữ liE ệ d u it củM a ast cây e n rh ịT pit hle â n S tì tyl m e 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 i struct tagTNode *pLeft; 1 iảTẬt gUậHu struct tagTNode *pRight; I T IẢ thà G }TNode; À v V u U IỆ liệ
Cấu trúc dữ liệu của cây L ữỮ d DcC typedef TNode *TREE; Ú R trú TuUấẤCC 4 Cá C c tlihck ao T t o á c E tr d ê i n t M câ a y st nhị e r p h T â int lte ì S m t ki yl ế e m Ø Tạo 1 cây rỗng
Ø Tạo 1 nút có trường Key bằng x i
Ø Thêm 1 nút vào cây nhị phân tìm kiếm
1 iảTẬt gUậHuI T ØXoá 1 nút có Key bằng x trên cây
IẢ thà GÀ v VuU ØTìm 1 nút có khoá bằng x trên cây IỆ liệ
L ữỮ d DcCÚR trú TuUấẤCC
5 Tạ C o lick cây r T ỗ o n g Edit Master Title Style
• Cây rỗng -> địa chỉ nút gốc bằng NULL void CreateTree(TREE &T) { T=NULL; i }
1 iảTẬt gUậHuI TIẢ thà GÀ v VuUIỆ liệ LữỮ d DcCÚR trú TuUấẤCC 6 Tạ C o l 1i ck nút T o có E K d e i y t b M ằna g st x er Title Style
TNode *CreateTNode(int x) { TNode *p;
p = new TNode; //cấp phát vùng nhớ động if(p==NULL) exit(1); // thoát i 1iả else T Ậ t gUậHu { I T IẢ thà
p->key = x; //gán trường dữ liệu của nút = x G À v V u p->pLeft = NULL; U IỆ liệ p->pRight = NULL; L ữỮ d Dc } C Ú R trú return p; T uUấẤCC } 7 Th C ê l mi ck mộ T t o n ú E t d x it Master Title Style
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 != NULL) { if (T->Key == X) return 0; i 1iảT
if (T->Key > X) return insertNode(T->pLeft, X); Ậ t gUậHu else
return insertNode(T->pRight, X); I T IẢ thà } G À v V u T = CreateTNode(X); U IỆ liệ L ữ return 1; Ữ d DcCÚ } R trú TuUấẤCC 8 Mi C nh l ick họa T t o h ê E m d 1 i t p M hầ a n st tửe r vàT o i tle câ y Style T 44 44 < X Thêm X=50 18 88 > X 88 i 1iảTẬt gUậHu 13 37 59 108 59 > X I T
IẢ thà GÀ v VuUIỆ liệ
15 23 40 55 71 L ữỮ d 55 > X D cCÚ insertNode R (T, X) trú 50 T uUấẤCC 9 Tì C m l nick út T có o khE o d á it b M ằn a g st x ( e d r ù T ngi tl đe ệ S q t u yl y) e
TNode *SearchTNode(TREE T, int x) { if(T!=NULL) { if(T->key==x) return T; i 1iả else if(x>T->key) T Ậ t gUậHu
return SearchTNode(T->pRight,x); I T IẢ thà else G À v V u
return SearchTNode(T->pLeft,x); U IỆ liệ } L ữỮ d Dc return NULL; C Ú R trú } T uUấẤCC 10 Tì C m n li ú ck t có To kh o E á d bằit n M g x a ( st kh e ôn rg T d i ù tl n e g đS ệ tyl qu e y)
TNode * searchNode(TREE Root, Data x) { Node *p = Root; while (p != NULL) i { if(x == p->Key) return p; 1 iảTẬt gUậH
else if(x < p->Key) p = p->pLeft; uI TIẢ thà G else p = p->pRight; À v V u U IỆ liệ } L ữỮ d Dc return NULL; C Ú R trú TuUấ } Ấ C C 11 Mi C nh l ick hoạ T tì o m E md ộ itt nM út aster Title Style 44 Tìm X=55 55 18 88 i 1iảTẬt gUậHu 13 37 59 108 I T
IẢ thà GÀ v VuUIỆ liệ
15 23 40 55 5 71 L ữỮ d DcCÚ Tìm thấy X=55 R trú TuUấẤCC 12 Mi C nh l ick hoạ T t o h à E nhd l it ậ pM 1 a st câ e y t r ừ T dit ã le y S số tyle 9, 5, 4, 8, 6, 3, 14,12,13 9 5 14 i 1iảTẬt gUậ 12 H u 4 8 I T
IẢ thà GÀ v VuUIỆ liệ
13 L ữ 3 6
Ữ d DcCÚR trú TuUấẤCC 13 Hủ C y l1i ck nút T o có Ed khoit á M bằ a n st g e X rt rT ê i nt le câ S y tyle
Ø 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á i
§ TH2: X chỉ có 1 cây con (cây con trái hoặc cây con phải) 1 iảTẬt gUậ
§ TH3: X có đầy đủ 2 cây con
H uI TIẢ thà ØTH1: Xoá nút lá mà không ảnh hưởng đến các nút G À v V u khác trên cây U IỆ liệ
L ữỮ d
Ø TH2: Trước khi xoá X ta móc nối cha của X với con D cCÚ duy nhất của X. R trú TuUấẤCC 14
Ø TH3: Dùng cách xoá gián tiếp Mi C nh l ick hoạ T h o ủ E y pd h it ầ nM t a ử st x e cór T 1 itl câ e y S co tyl n e 44 Hủy X=37 18 88 i 1iảTẬt gUậ 13 37 59 108
H uI TIẢ thà GÀ v VuUIỆ liệ 15 23 55 71
L ữỮ d DcCÚR trú TuUấẤCC 15 Hủ C y l1i ck nút T o có E 2 di cât M y a conster Title Style
Ø 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. i
Ø Ta tiến hành xoá hủy nút Y (xoá Y giống 2 trường 1 iảTẬt g hợp đầu)
U ậHuI T ØCách tìm nút thế mạng Y cho X: Có 2 cách IẢ thà GÀ v §
C1: Nút Y là nút có khoá nhỏ nhất (trái nhất) bên V u U IỆ liệ cây con phải X L ữỮ d Dc
§ C2: Nút Y là nút có khoá lớn nhất (phải nhất) bên C Ú R trú cây con trái của X T uUấẤCC 16 Mi C nh l ick họa T h o ủ E y pd h it ầ nM t a ử st X er có T 2 itl câe y S cotyl n e
Xoá nút có trường 44
Key = 18, lúc đó nút có
khoá 23 là nút thế mạng
18 88 i 1iảTẬt gUậ 13 37 59 108
H uI TIẢ thà GÀ v VuU 15 23 2 40 55 71 IỆ liệ L ữỮ d DcCÚR trú 30 T uUấẤCC 17 CàiC đliặck t th T a o o tE á d c it xo M á a n st út er có tT r i ư tl ờe n S g t K yl e e y = 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 = T; i if (T->Left ==NULL) T = T->Right; 1 iảTẬ else if(T->Right==NULL) T=T->Left; t gUậHu else I T
ThayThe1(p, T->Right);// tìm bên cây con phải IẢ thà GÀ v delete p; V u U } IỆ liệ L ữ } Ữ d Dc else C Ú
printf("Khong tim thay phan can xoa tu"); R trú Tu } U ấẤCC 18 Hà C m litck ìm T p o hầ E n td ửi t M hế ast mạ e n r g Title Style
void ThayThe1(TREE &p, TREE &T) { if(T->Left!=NULL) ThayThe1(p,T->Left); else i 1iả { T Ậ t gUậHu
p->Key = T->Key; // Gán lại giá trị node bi I T IẢ thà G xoá À v V u U IỆ liệ
p = T; // Trỏ đến node bị xoá thực sự L ữỮ d DcC
T = T->Right; //Cô lập node bị xoá Ú R trú TuUấẤ } C C 19 } Click To Edit B M ài a t st ập er Title Style
• Cài đặt để nhập một danh sách các số
nguyên vào Cây NPTK cho đến khi gặp số 0. • In ra tình trạng cây.
• Tìm giá trị X (nhập từ bàn phím) xem có trên i cây hay không?
1 iảTẬt gUậ • Nếu có X, hãy xoá nó khỏi cây và in ra tình H uI T trạng cây. IẢ thà GÀ v Vu
– Định nghĩa - Duyệt cây U IỆ liệ L ữ
– Tạo cây, node, insert node Ữ d DcCÚ – Tìm x - Xoá node R trú TuUấẤCC 20