



















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