1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Please purchase a personal license.CHƯƠNG 4 - CÂY

45 250 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

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

Ngày đăng: 21/04/2016, 18:28