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
Môn: Cấu trúc dữ liệu và giải thuật (IT003)
Trường: Trường Đại học Công nghệ Thông tin, Đại học Quốc gia Thành phố Hồ Chí Minh
Thông tin:
Tác giả:
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