Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 45 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
45
Dung lượng
3,26 MB
Nội dung
Please purchase a personal license CHƯƠNG CÁC KHÁI NIỆM • Định nghĩa • ĐN1: Cây đồ thị liên thông chu trình • ĐN2: Một tập hợp hữu hạn nút có nút đặc biệt gọi gốc (root) Giữa nút có mối quan hệ phân cấp gọi quan hệ cha-con CÁC KHÁI NIỆM – HÌNH ẢNH A GỐC B F C D E G H I J K L M N P Q CÁC KHÁI NIỆM • Bậc nút: số nút • Bậc cây: bậc nút có bậc lớn Cây có bậc n gọi n - phân • Nút gốc: nút có nút cha • Nút lá: nút có bậc • Nút nhánh: nút có bậc khác nút gốc • Cây con: Là có gốc nút nhánh, CÁC KHÁI NIỆM • Mức nút • Gốc có mức • Nếu nút cha có mức i nút có mức i+1 • Chiều cao cây: mức nút có mức lớn có • Đường đi: Dãy nút N1, N2, , Nk gọi đường Ni cha Ni+1 (1 ≤ i ≤ k-1) • Độ dài đường đi: số nút đường -1 CÁC KHÁI NIỆM • Cây thứ tự: Các nút theo thứ tự định • Rừng: tập hợp hữu hạn phân biệt A B A C Cây thứ tự B D O G C M E Rừng gồm N CÂY NHỊ PHÂN • Định nghĩa: Là mà nút nút con, hai nút (nếu có) gọi trái phải A • Cây trái: có gốc nút trái B D • Cây phải: có gốc nút phải C E G J F H K I CÂY NHỊ PHÂN • 2.2 Tính chất: Đối với nhị phân cần ý tới số tính chất sau A • Số lượng tối đa nút có mức i nhị phân mũ (i -1) (i ≥ 1) • Số lượng nút tối đa nhị phân có chiều cao h (2 mũ h) -1(h ≥ ) B D C E G J F H K I BIỂU DIỄN CÂY NHỊ PHÂN • Lưu trữ • Phương pháp tự nhiên để biểu diễn nhị phân nút trái nút phải nút • Sử dụng mảng để lưu trữ nút nhị phân • Mỗi nút biểu diễn CẤU TRÚC gồm ba thành phần: INFOR: mô tả thông tin gắn với nút LEFT : nút trái RIGHT: nút phải LEFT INFOR RIGHT BIỂU DIỄN CÂY NHỊ PHÂN • Giả sử nút được đánh số từ đến max-1, liệu nút có kiểu Item Khi cấu trúc liệu biểu diễn nhị phân khai báo sau: #define max N //số nút nhiều có //Khai báo kiểu liệu Item (nếu cần) struct Node { Item infor; int letf; int right; }; Node T[max]; //T mảng lưu trữ nút CÁC PHÉP TOÁN TRÊN CNPTK • Cách thực • Nếu rỗng -> return NULL • Ngược lại so sánh khóa gốc với khóa K • Nếu -> return Root • Nếu lớn -> tìm kiếm nút K trái • Nếu nhỏ -> tìm kiếm nút K phải CÁC PHÉP TOÁN TRÊN CNPTK • Hàm đệ quy TRO Search(TRO Root, KeyType K) { if(Root ==NULL) return NULL; else if(Root->infor==K) return Root; else if(Root->infor>K) return Search(Root->left,K); else return Search(Root->right,K); } CÁC PHÉP TOÁN TRÊN CNPTK • Hàm lặp TRO Search(TRO Root, KeyType K) { TRO Q; Q=Root; while(Q !=NULL && Q->infor!=K) { if (Q->infor>K) Q=Q->left; else Q=Q->right; } return Q; } CÂY NHỊ PHÂN TÌM KIẾM Ví dụ: Tìm nút có khóa K=10 Q Root 15 Q 24 Q 20 10 12 34 55 CÁC PHÉP TOÁN TRÊN CNPTK • Duyệt nhị phân tìm kiếm • Duyệt theo thứ tự trước • Duyệt theo thứ tự • Duyệt theo thứ tự sau • Lưu ý: Duyệt theo thứ tự cho thứ tự khóa theo thứ tự tăng dần CÁC PHÉP TOÁN TRÊN CNPTK • Chèn nút có khóa K vào • Nếu rỗng nút gốc cây, return 1; • Ngược lại • Nếu khóa gốc == K, return 0; • Nếu khóa gốc > K, chèn nút K vào trái • Nếu khóa gốc < K, chèn nút k vào phải CÁC PHÉP TOÁN TRÊN CNPTK • Hàm đệ quy int Insert(TRO &Root, KeyType K) { if(Root ==NULL) Root = new Node; { Root->infor = K; Root->left=Root->right=NULL; return 1; } else if(Root->infor==K) return 0; else if(Root->infor>K) return Insert(Root->left,K); else return Insert(Root->right,K); } CÁC PHÉP TOÁN TRÊN CNPTK • Loại bỏ nút • TH1: Nút loại bỏ gốc • Tìm cha nút này, cho biết trái hay phải cha • Nếu nút − Hủy − Gán trái/phải cha NULL • Nếu nút nhánh − Ghép phải vào bên phải trái (hoặc ngược lại) − Gán trái/phải cha trái − Hủy CÂY NHỊ PHÂN TÌM KIẾM Ví dụ: Xóa nút có khóa K=9 Root 15 24 M 20 10 34 Q 12 55 CÂY NHỊ PHÂN TÌM KIẾM Root M 15 24 Q 10 9 20 10 12 12 34 55 CÁC PHÉP TOÁN TRÊN CNPTK • Loại bỏ nút • TH2: Nút loại bỏ gốc • Ghép phải vào bên phải trái (hoặc ngược lại) • Gán trái (hoặc phải) • Hủy CÂY NHỊ PHÂN TÌM KIẾM Root Q 15 Root 24 20 10 12 34 55 GHÉP CÂY void Ghep(TRO &R1, TRO R2) { if(R1 ==NULL) R1=R2; else Ghep(R1->right,R2) } TÌM CHA CỦA MỘT NÚT TRO Cha(TRO Root, int &u, TRO Q) { TRO M=Root; if (Q->inforinfor) if (M->left==Q){ u=-1; return M; } else M=M->left; else if (M->right==Q){ u=1; return M; } else M=M->right; } XÓA MỘT NÚT void Xoa(TRO &Root, TRO Q) { int u; TRO M; Ghep(Q->left, Q->right); if (Q==Root) Root=Root->left; else{ M = Cha(Root, u, Q); if (u==-1) M->left = Q->left; M->right = Q->left; else } delete Q; } [...]... thứ tự gi a • Nếu cây không rỗng 0 A • Duyệt cây con trái theo thứ tự gi a 1 B 2 C • Thăm gốc • Duyệt cây con phải theo thứ tự gi a DHBIEJAFCKG 3 D 4 8 H 9 I E 5 10 J F 6 G 13 K DUYỆT CÂY NHỊ PHÂN • Duyệt theo thứ tự sau • Nếu cây không rỗng 0 A • Duyệt cây con trái theo thứ tự sau • Duyệt cây 1 con B 2 C phải theo thứ tự sau • Thăm gốc HDIJEBFKGCA 3 D 4 8 H 9 I E 5 10 J F 6 G 13 K DUYỆT CÂY NHỊ PHÂN... trỏ vào gốc cây Root = NULL -> cây rỗng BIỂU DIỄN CÂY NHỊ PHÂN • Lưu trữ móc nối • Hình ảnh cây nhị phân lưu trữ móc nối Root A C B D E G DUYỆT CÂY NHỊ PHÂN • Duyệt cây nhị phân là truy xuất lần lượt vào các nút trên cây theo một thứ tự nhất định • Có 4 phương pháp duyệt cây: • TOP-DOWN-LEFT-RIGHT • Duyệt theo thứ tự trước – PreOrder • Duyệt theo thứ tự gi a - InOrder • Duyệt theo thứ tự sau - PostOrder... DUYỆT CÂY NHỊ PHÂN • TOP-DOWN-LEFT-RIGHT • Với cây được lưu trữ kế tiếp 0 • Ví dụ: với cây hình bên thứ 1 tự các nút được thăm là: 3 D A B 4 2 E 5 C F 6 G ABCDEFGHIJK 8 H 9 I 10 J 13 K DUYỆT CÂY NHỊ PHÂN • Duyệt theo thứ tự trước 0 • Nếu cây không rỗng • Thăm gốc 1 A B 2 C • Duyệt cây con trái theo thứ tự trước 3 D 4 • Duyệt cây con phải theo thứ E 5 F 6 G tự trước ABDHEIJCFGK 8 H 9 I 10 J 13 K DUYỆT CÂY...BIỂU DIỄN CÂY NHỊ PHÂN infor left right 0 1 2 3 4 5 6 7 8 9 A B C D E F G ∅ H I 1 3 5 0 9 0 13 0 0 2 4 6 8 10 0 0 0 0 10 J 0 0 11 ∅ - - 12 ∅ K ∅ - - 0 - 0 - TT 13 14 0 1 3 D A B 4 8 H 9 I 2 E 5 10 J C F 6 G 13 K BIỂU DIỄN CÂY NHỊ PHÂN • Lưu trữ móc nối • Cách lưu trữ này khắc phục được nhược điểm c a cách lưu trữ kế tiếp, đồng thời phản ánh được dạng tự nhiên c a cây • Trong cách lưu trữ... =K D C K CÂY NHỊ PHÂN TÌM KIẾM • Định ngh a • Cây nhị phân tìm kiếm (CNPTK) là cây nhị phân hoặc rỗng hoặc không rỗng thì phải thoả mãn đồng thời các điều kiện sau: • Khoá c a các nút thuộc cây con trái nhỏ hơn khoá nút gốc • Khoá c a nút gốc nhỏ hơn khoá c a các nút thuộc cây con phải c a nút gốc • Cây con trái và cây con phải c a gốc cũng là cây nhị phân tìm kiếm CÂY NHỊ PHÂN TÌM KIẾM 15 24 7 2 20... Search(TRO Root, KeyType K) { TRO Q; Q=Root; while(Q !=NULL && Q->infor!=K) { if (Q->infor>K) Q=Q->left; else Q=Q->right; } return Q; } CÂY NHỊ PHÂN TÌM KIẾM Ví dụ: Tìm nút có kh a K=10 Q Root 15 Q 24 7 Q 2 20 10 9 12 34 55 CÁC PHÉP TOÁN TRÊN CNPTK • Duyệt cây nhị phân tìm kiếm • Duyệt cây theo thứ tự trước • Duyệt cây theo thứ tự gi a • Duyệt cây theo thứ tự sau • Lưu ý: Duyệt cây theo thứ tự gi a. .. NULL • Ngược lại so sánh kh a ở gốc với kh a K • Nếu bằng -> return Root • Nếu lớn hơn -> tìm kiếm nút K ở cây con trái • Nếu nhỏ hơn -> tìm kiếm nút K ở cây con phải CÁC PHÉP TOÁN TRÊN CNPTK • Hàm đệ quy TRO Search(TRO Root, KeyType K) { if(Root ==NULL) return NULL; else if(Root->infor==K) return Root; else if(Root->infor>K) return Search(Root->left,K); else return Search(Root->right,K); } CÁC PHÉP TOÁN... nếu là toán hạng sang bước 4, ngược lại sang bước 5 • Bước 4: Đẩy toán hạng vào ngăn xếp, rồi quay lại bước 2 • Bước 5: Lấy 2 toán hạng trong ngăn xếp, giả sử được lần lượt là A và B, thực hiện B T A (với T là toán tử v a đọc được), được kết quả đẩy vào ngăn xếp và quay lại bước 2 • Bước 6: Nhận kết quả trong ngăn xếp, và kết thúc ĐỊNH GIÁ BIỂU THỨC xyzt-*+uv/+∅ z-t = A t z y x y *A= B A y x x+B=C B x... như sau: LEFT INFOR RIGHT • infor: ứng với thông tin (dữ liệu) c a nút • left: là con trỏ, trỏ tới cây con trái c a nút đó • right: là con trỏ, trỏ tới cây con phải c a nút đó BIỂU DIỄN CÂY NHỊ PHÂN • Lưu trữ móc nối • Ta có thể khai báo cấu trúc dữ liệu như sau: //Khai báo kiểu dữ liệu Item struct Node { Item infor; Node *left, *right; }; typedef Node *TRO; // Định ngh a kiểu con trỏ TRO Root; //Khai... 10 9 12 34 55 CÂY NHỊ PHÂN TÌM KIẾM • Cài đặt cây nhị phân tìm kiếm • Mỗi nút trên cây nhị phân tìm kiếm có dạng LEFT INFOR RIGHT • Giả sử dữ liệu trên mỗi nút c a cây có kiểu dữ liệu là Item, khi đó cấu trúc dữ liệu c a cây TKNP được định ngh a như sau: //Khai báo kiểu dữ liệu Item struct Node { Item infor; Node *left, *right; }; typedef Node *TRO; // Định ngh a kiểu con trỏ TRO Root; //Khai báo con