Sử dụng cấu trúc dạng cây, chúng ta cần dùng giải thuật nào với từng dạng dữ liệu để đạt hiệu quả cao nhất. Để giải quyết vấn đề trên ta cùng tìm hiểu một số phương pháp duyệt cây. Mời các bạn cùng tham khảo!
Trang 2M C L CỤ Ụ
Trang 3L i m đ u ờ ở ầ
Cùng v i s phát tri n c a khoa h c kĩ thu t , công ngh thông tin nói chung và ớ ự ể ủ ọ ậ ệ
b môn c u trúc d li u và gi i thu t nói riêng ngày càng độ ấ ữ ệ ả ậ ượ ức ng d ng r ng rãi ụ ộ trong nhi u lĩnh v c. V i m t c s d li u kh ng l , vi c đ a ra m t phề ự ớ ộ ơ ở ữ ệ ổ ồ ệ ư ộ ương pháp nh m gi i quy t v n đ tìm ki m d li u có hi u qu và nhanh chóng nh t ằ ả ế ấ ề ế ữ ệ ệ ả ấ luôn đượ ực s quan tâm c a các nhà phát tri n ph n m m. Thông thủ ể ầ ề ường d li u ữ ệ
được bi u di n dể ễ ướ ại d ng danh sách liên k t. Vi c truy su t d li u ch a đ t hi uế ệ ấ ữ ệ ư ạ ệ
qu cao. S d ng c u trúc d li u cây là m t gi i pháp làm tăng hi u su t trong cácả ử ụ ấ ữ ệ ộ ả ệ ấ thao tác x lý. V n đ đ t ra : v i vi c s d ng c u trúc d ng cây, chúng ta c n ử ấ ề ặ ớ ệ ử ụ ấ ạ ầ dùng gi i thu t nào v i t ng d ng d li u đ đ t hi u qu cao nh t. Đ gi i quy tả ậ ớ ừ ạ ữ ệ ể ạ ệ ả ấ ể ả ế
v n đ trên ta cùng tìm hi u m t s phấ ề ể ộ ố ương pháp duy t cây.ệ
Trang 4I C S LÝ THUY T Ơ Ở Ế
I.1 Cây nh phân tìm ki m ị ế
Cây (Trees) là m t t p h p h u h n các ph n t g i là nút cây (Node), trongộ ậ ợ ữ ạ ầ ử ọ
đó có m t nút đ c bi t g i là nút g c (Root). Trên t p h p các nút này cóộ ặ ệ ọ ố ậ ợ
m t quan h phân c p g i là quan h "cha con".ộ ệ ấ ọ ệ
Cây nh phân tìm ki m (binary search tree – BST) là cây nh phân trong đó t i ị ế ị ạ
m i nút, khóa c a nút đang xét l n h n nút khóa c a t t c các nút thu c câyỗ ủ ớ ơ ủ ấ ả ộ con trái và nh h n t t c nút khóa thu c cây con ph i.ỏ ơ ấ ả ộ ả
Ví dụ
I.2 M t s khái ni m ộ ố ệ
M t nút đ n đ c cũng là m t cây.ộ ơ ộ ộ
T p h p r ng cũng là m t cây mà ta g i là cây r ng.ậ ợ ỗ ộ ọ ỗ
M c c a m t nút :ứ ủ ộ
+ Nút g c : M c 0.ố ứ
+ Các nút cách nút g c i c nh đố ạ ược g i là nút m c i.ọ ở ứ
Nút g c (Root): Là nút không có nút cha.ố
Nút lá (leaf): Là nút không có nút con
Chi u cao c a m t nút: Là đ dài đ ng đi t nút đó đ n nút lá xa nh t.ề ủ ộ ộ ườ ừ ế ấ Chi u cao c a m t cây: Là chi u cao c a nút g c.ề ủ ộ ề ủ ố
Trang 5B c c a m t nút: Là s nút con c a nút đó.ậ ủ ộ ố ủ
B c c a m t cây: Là b c cao nh t c a các nút trong cây.ậ ủ ộ ậ ấ ủ
II MÔ T CÁC THAO TÁC TRÊN CÂY NH PHÂN TÌM KI M Ả Ị Ế
II.1 Khai báo cài đ t cây nh phân ặ ị
Đ bi u di n cây nh phân ta ch n phể ể ễ ị ọ ương pháp c p phát liên k t. ng v i m t ấ ế ứ ớ ộ nút c a, ta dùng m t bi n đ ng l u tr các thông tin.ủ ộ ế ộ ư ữ
Thông tin l u tr t i nút.ư ữ ạ
Đ a ch nút g c c a cây con trái trong b nh ị ỉ ố ủ ộ ớ
Đ a ch c a nút g c c a cây con ph i trong b nh ị ỉ ủ ố ủ ả ộ ớ
Khai báo tương ng nh sau:ứ ư
#include<stdlib.h>
#include<stdio.h>
typedef int item ; struct NODE {
int key;
NODE *Left, *Right;
typedef NODE *TREE;
II.2 Hàm kh i t o r ng ở ạ ỗ
void khoitaorong(TREE &T){
T=NULL;
} II.3 Hàm ki m tra r ng ể ỗ
int ktrarong(TREE T){
if(T==ULL) return 1;
Trang 6else return 0;
} II.4 Hàm thêm m t nút ộ
Hàm này cho phép chúng ta nh p thêm m t s vào dãy s mà ta đã nh p và ậ ộ ố ố ậ xét s đó đ s p x p vào v trí c a m t nút trong cây.ố ể ắ ế ị ủ ộ
X y ra hai trả ường h p:ợ
Cây r ng.ỗ
Cây không r ng.ỗ
N u X trùng v i g c thì ta không th thêm node.ế ớ ố ể
N u X< g c và ch a có lá con bên trái thì th c hi n thêm vào bên tráiế ố ư ự ệ
Tương t X> g c thì ta thêm vào bên ph i.ự ố ả
II.5 Hàm xóa m t nút. ộ
Hàm cho phép ta xóa m t nút trong cây tìm ki m nh phân.ộ ế ị
X y ra hai trả ường h p.ợ
Cây r ng.ỗ
Cây khác r ng. ỗ
X là nút lá
X ch có m t con trái (ph i).ỉ ộ ả
X có đ c hai conủ ả
Xây d ng thêm hàm tìm ki m.ự ế
Hàm tìm ki m có nhi m v xác đ nh v trí c a nút c n xóa.ế ệ ụ ị ị ủ ầ
II.6 Hàm nh p m t cây tìm ki m nh phân ậ ộ ế ị
Cho phép ta nh p n s ta mu n, n s đó s t o thành n nút trong cây ậ ố ố ố ẽ ạ
nh phân.ị
Hàm còn làm thêm nhi m v s p x p v trí đ ng c a các nút v a ệ ụ ắ ế ị ứ ủ ừ
nh p.ậ
Trang 7II.7 Hàm duy t cây ệ
II.7.1 Duy t theo th t tr ệ ứ ự ước
Hàm có nhi m v :ệ ụ
Thăm nút g c.ố
Thăm các nút g c c a cây con trái theo th t trố ủ ứ ự ước
Thăm các nút g c c a cây con ph i theo th t trố ủ ả ứ ự ước
II.7.2 Duy t theo th t gi a ệ ứ ự ữ
Hàm có nhi m v :ệ ụ
Thăm các nút g c c a cây con trái theo th t gi a.ố ủ ứ ự ữ
Thăm nút g c.ố
Thăm các nút g c c a cây con ph i theo th t gi a.ố ủ ả ứ ự ữ
II.7.3 Duy t theo th t sau ệ ứ ự
Hàm có nhi m v sau:ệ ụ
Thăm các nút g c c a cây con trái theo th t sau.ố ủ ứ ự
Thăm các nút g c c a cây con ph i theo th t sau.ố ủ ả ứ ự
Thăm nút g c.ố
II.8 Hàm xác đ nh s nút c a cây ị ố ủ
S d ng hàm đ đ m xem trên cây có t t c bao nhiêu nút.ử ụ ể ế ấ ả
X y ra 2 trả ường h p:ơ
Cây r ng s nút trên cây là 0.ỗ ố
Cây không r ng: thì chi u cao cây s t ng các nút bên trái và nút bên ỗ ề ẽ ổ
ph i c a cây c ng v i 1 ( 1 là nút g c).ả ủ ộ ớ ố II.9 Hàm xác đ nh chi u cao c a cây ị ề ủ
Hàm này s d ng đ tính chi u cao c a cây nh phân t c là đ m s t ng ử ụ ể ề ủ ị ứ ế ố ầ
c a cây tìm ki m nh phân.ủ ế ị
Ta có các trường h p sau:ợ
Trang 8 Trường h p cây r ng thì xu t ra chi u cao c a cây là 1.ợ ỗ ấ ề ủ
Cây khác r ng:ỗ
Không có cây con bên trái và bên ph i thì chi u cao c a cây là 0.ả ề ủ
Có c cây con bên trái và bên ph i thì chi u cao là 1+ cây bên trái ả ả ề + cây bên ph i.ả
Cây c c trái ho c cây c c ph i thì chi u cao c a cây là 1+ cây bênự ặ ự ả ề ủ trái ho c 1 + cây bên ph i.ặ ả
II.10 Hàm xác đ nh m c c a cây ị ứ ủ
Hàm này s d ng đ xác đ nh m c c a m t nút b t k mà nử ụ ể ị ứ ủ ộ ấ ỳ ườ ử ụi s d ng
c n xác đ nh, nút đầ ị ược nh p t bàn phím.có s d ng bi m đ m, m i l n ậ ừ ử ụ ế ế ỗ ầ
nh th l i c ng thêm m t giá tr ư ế ạ ộ ộ ị
III CH ƯƠNG TRÌNH MINH H AỌ
III.1 Xây d ng ch ự ương trình
Đ bài:ề Cây nh phân tìm ki m.ị ế
Vi t chế ương trình cài đ t m t cây tìm ki m nh phân (nhãn c a m i nút đặ ộ ế ị ủ ỗ ượ c
nh p t bàn phím) . ậ ừ
Yêu c u chi ti t:ầ ế
1. Vi t ph n khai báo đ cài đ t m t cây tìm ki m nh phân. ế ầ ể ặ ộ ế ị
2. Vi t th t c kh i t o cây r ng. ế ủ ụ ở ạ ỗ
3. Vi t hàm ki m tra cây r ng. ế ể ỗ
4. Vi t th t c xen m t nút vào cây tìm ki m nh phân. ế ủ ụ ộ ế ị
5. Vi t th t c xóa m t nút trong cây tìm ki m nh phân. ế ủ ụ ộ ế ị
6. Vi t th t c nh p m t cây tìm ki m nh phân v i nhãn c a các nút c a câyế ủ ụ ậ ộ ế ị ớ ủ ủ
được nh p vào t bàn phím. ậ ừ
7. Vi t các th t c duy t cây: ế ủ ụ ệ
Duy t ti n t , trung t , h u t . ệ ề ự ự ậ ự
8. Vi t hàm xác đ nh s nút trong cây. ế ị ố
9. Thi t k hàm xác đ nh chi u cao c a cây. ế ế ị ề ủ
10. Vi t hàm xác đ nh m c c a m t nút trong cây. ế ị ứ ủ ộ
BÀI LÀM
Trang 9// ph n khai báoầ
#include<stdlib.h>
#include<stdio.h>
typedef int item ; //kieu item la kieu nguyen struct NODE
{ int key; //truong key cua du lieu NODE *Left, *Right; //con trai va con phai };
int nmax(int a,int b){
return a>=b?a:b;
} int d=0;
typedef NODE *TREE; //cay // khoi tao rong
void khoitaorong(TREE &T){
T=NULL;
} // ktra rong int ktrarong(TREE T){
if(T==NULL) return 1;
return 0;
} // hàm thêm nút int themnut(TREE &T, int x) // chen 1 Node vao cay {
Trang 10if (T != NULL) {
if (T>key == x) return 1;
if (T>key > x) return themnut(T>Left, x);
else if (T>key < x) return themnut(T>Right, x); }
T = (NODE *) malloc(sizeof(NODE));
if (T == NULL) return 0;
T>key = x;
T>Left = T>Right = NULL;
return 1;
} // hàm nhap void nhap(TREE &T) // nhap cay {
int x, tl;
while (tl) {
printf("\n Nhap vao Node: ");
scanf("%d", &x);
int check = themnut(T, x);
if (check == 1) printf("\n\n Node da ton tai!"); else if (check == 0) printf("\n Khong du bo nho"); printf("\n Ban co muon tiep tuc khong <0/1>");
scanf("%d",&tl);
} } // Duyet theo TTT
Trang 11void ttt(TREE T) {
if(T!= NULL) {
printf("%d ",T>key); ttt(T>Left);
ttt(T>Right);
} } // duyet theo tt giua void ttg(TREE T) {
if(T!=NULL) {
ttg(T>Left);
printf("%d ", T>key); ttg(T>Right);
} } // duyet theo tt sau void tts(TREE T) {
if(T!=NULL) {
tts(T>Left);
tts(T>Right);
printf("%d ", T>key); }
Trang 12} // hàm tìm nút NODE* timnut(TREE T, int x) {
if (T!=NULL) {
if (T>key == x) { NODE *P = T; return P;}
if (T>key > x) return timnut(T>Left, x);
if (T>key < x) return timnut(T>Right, x);
} return NULL;
} // dem nut int demnut(TREE T){
if(T==NULL)
return 0;
else
return (demnut(T>Right) + demnut(T>Left) + 1);
} // hàm xóa nút int xoanut(TREE &T, int x) // xoa nut co key x {
if (T==NULL) return 0;
if (T>key > x) return xoanut(T>Left, x);
if (T>key < x) return xoanut(T>Right, x);
else // T>key == x {
Trang 13if (T>Left == NULL) T = T>Right; // Node chi co cay con phai else if (T>Right == NULL) T = T>Left; // Node chi co cay con trai
else // Node co ca 2 con {
NODE* q = T>Right;
timnut(T, x);
} delete p;
} }
//xac dinh chieu cao cua cay int ccaocay(TREE T){
if(T==NULL)return 1;
else
if((T>Right==NULL) && (T>Left==NULL)) return 0;
else
if((T>Right!=NULL) && (T>Left!=NULL)) return nmax((1 + ccaocay(T>Right)),(1 + ccaocay(T>Left))); else
if(T>Left==NULL&&T>Right!=NULL)
return (1 + ccaocay(T>Right));
else
if(T>Left!=NULL&&T>Right==NULL)
Trang 14return (1 + ccaocay(T>Left)); }
// hàm xác đ nh m c c a m t nútị ứ ủ ộ
void muc(TREE T, int x) {
if (T!=NULL) {
d++;
if (T>key > x) muc(T>Left, x);
if (T>key < x) muc(T>Right, x);
} } // hàm main int main() {
TREE T;
T=NULL; //Tao cay rong
nhap(T); //Nhap cay //duyet cay
printf("\n Duyet cay theo ttt: ");
ttt(T);
printf("\n Duyet cay theo ttg: ");
ttg(T);
printf("\n Duyet cay theo tts: ");
tts(T);
printf("\n so nut cua cay la:%d", demnut(T));
Trang 15int a;
printf("\n Nhap nut: "); scanf("%d",&a);
d=0; muc(T,a); printf(" Muc cua nut la: %d",d);
NODE *P;
int x;
printf("\n Nhap vao nut can tim: ");
scanf("%d", &x);
P = timnut(T, x);
if (P != NULL) printf("\n Tim thay nut %d: ", P>key); else printf("\n nut %d khong co trong cay: ", x);
if (xoanut(T, x)) printf("\n Xoa thanh cong. ");
else printf("\n Khong tim thay nut %d can xoa: ", x); printf("\n Duyet cay theo ttt: ");
ttt(T);
printf("\n Duyet cay theo ttg: ");
ttg(T);
printf("\n Duyet cay theo tts: ");
tts(T);
printf("\n Chieu cao cay la: %d",ccaocay(T));
printf("\n so nut cua cay la:%d", demnut(T));
return 0;
}
Trang 16III.2 K t qu ế ả
Chương trình cho ta được k t qu sau:ế ả
Xu t ra đấ ược các th t duy t : TTT, TTG, TTS.ứ ự ệ
Đ m đế ượ ốc s nút c a cây.ủ
Xác đ nh đị ược chi u cao c a cây.ề ủ
Xác đ nh đị ược m c c a nút.ứ ủ
Tìm nút c a cây.ủ
xóa thành công nút c n xóa trên cây.ầ
Thêm được các nút ch a có trên cây.ư
Ví d :ụ
Nh p m t dãy s sau: 12 22 43 55ậ ộ ố
Chương trình xu t ra:ấ
Duy t theo ttt: 12 22 43 55ệ
Duy t theo ttg: 12 22 43 55ệ
Duy t theo tts: 55 43 22 12ệ
S nút c a cây là : 4ố ủ
Chi u cao c a cây là: 3ề ủ
Nh p nút: 12ậ
M c c a nút là : 1ứ ủ
Nh p nút : 12ậ
Tìm th y nút 12ấ
Xóa thành công
Duy t theo ttt : 22 43 55ệ
Duy t theo ttg: 22 43 55ệ
Duy t theo tts: 55 43 22ệ
Chi u cao c a cây : 2ề ủ
S nút c a cây : 3ố ủ
Trang 17IV K T LU N Ế Ậ
Sau m t th i gian tìm hi u, nghiên c u và th c hi n đ tài các yêu c u ộ ờ ể ứ ự ệ ề ầ chính c a đ tài c b n đã hoàn t t v i các n i dung sau:ủ ề ơ ả ấ ớ ộ
IV.1 Ư u đi mể
Xây d ng đự ược chương trình “ tìm ki m cây nh phân” s d ng các ế ị ử ụ thu t toán tìm ki m đậ ế ược các node trên cây nh phân.ị
Chương trình s lý nhanh và tử ương đ i chính xác.ố
IV.2 Khuy t đi m ế ể
M c dù r t c g ng nh ng trong th i gian ng n, kinh nghi m còn h n ặ ấ ố ắ ư ờ ắ ệ ạ
ch nên k t qu còn thi u sót c n ti p t c đế ế ả ế ầ ế ụ ược hoàn thi n đ có th ệ ể ể
gi i đả ược các yêu c u ph c t p h n.ầ ứ ạ ơ
Chương trình còn nhi u l i nh : v v n đ x lý, hay thu t toán xóa ề ỗ ư ề ấ ề ử ậ nút còn ch a t i u,….ư ố ư
IV.3 H ướng phát tri nể
Xây d ng hoàn thi n các ch c năng giúp ngự ệ ứ ườ ử ụi s d ng d dàng h n, ễ ơ các phương pháp duy t t i u và hi u qu h n.ệ ố ư ệ ả ơ
Trên đây là k t qu đ t đế ả ạ ược cũng nh còn m t s t n t i, hư ộ ố ồ ạ ướng phát tri n c a ể ủ
đ tài.ề
Em xin chân thành c m n s quan tâm, giúp đ , nhi t tình c a cô ả ơ ự ỡ ệ ủ Tr nh Th Phúị ị giúp em hoàn thành đ tài này.ề
Sinh viên th c hi n.ự ệ
Đ Vi t Vũ.ỗ ế
Trang 18TÀI LI U THAM KH OỆ Ả
Đ Xuân Lôi,ỗ C u trúc d li u và gi i thu t ấ ữ ệ ả ậ , nhà xu t b n Đ i h c Qu c gia Hàấ ả ạ ọ ố
N i, 2006ộ
Lê Minh Trung, Bài t p c u trúc d li u và gi i thu t ậ ấ ữ ệ ả ậ , Nhà xu t b n th ng kê, ấ ả ố 2005
6.2.2: Binary Tree Searching, pp 426–458
Stein Introduction to Algorithms, Second Edition MIT Press and McGraw-Hill,
2001 ISBN 0-262-03293-7 Chapter 12: Binary search trees, pp 253–272
Section 15.5: Optimal binary search trees, pp 356–363