NỘI DUNG CẤU TRÚC CÂY • • • • • CÁC THUẬT NGỮ CƠ BẢN CÁC PHÉP TOÁN CHÍNH CÁC PHƯƠNG PHÁP CÀI ĐẶT CÂY CÂY NHỊ PHÂN CÂY TÌM KIẾM NHỊ PHÂN Bộ môn Công nghệ phần mềm, Khoa CNTT&TT, Đại học Cần Thơ CÁC THUẬT NGỮ CƠ BẢN (1) • Định nghĩa – Cây (tree): tập hợp hữu hạn phần tử gọi nút (nodes) tập hợp hữu hạn cạnh nối cặp nút lại với mà không tạo thành chu trình Nói cách khác, đồ thị chu trình A – Ví dụ: B CÁC THUẬT NGỮ CƠ BẢN (2) • Ta định nghĩa cách đệ qui sau: – Một nút đơn độc cây, nút nút gốc – Nút n nút đơn độc k riêng lẻ T1, T2, Tk có nút gốc n1, n2, nk Khi ta có có nút gốc nút n T1, T2, Tk – Mô hình: Nuït gäúc n C n1 n1 nk Cáy D E F T1 T2 Tk CÁC THUẬT NGỮ CƠ BẢN (3) • Ví dụ CÁC THUẬT NGỮ CƠ BẢN (4) • Nút cha con: nút A cha nút B nút A mức i nút B mức i+1, đồng thời A B có cạnh nối – VD: Ở trên, nút B cha G H Nút I D • Bậc nút số nút đó, bậc nút =0 – VD: A có bậc 5, C có bậc 0, O có bậc • Bậc bậc lớn nút – VD: có bậc • Cây n-phân có bậc n – VD: Bậc hay ngũ phân CÁC THUẬT NGỮ CƠ BẢN (5) • Nút gốc (root ) nút cha – VD: nút gốc A • Nút (leaf) nút – VD: nút C, G, H, J, K, M, N, P, Q • Nút trung gian (interior node): nút có bậc khác nút gốc – VD: nút B, D, E, F, I, L, O • Nút tiền bối(descendant) & nút hậu duệ(ancestor): Nếu có đường từ nút a đến nút b nút a tiền bối b, b hậu duệ a – VD: D tiền bối Q, Q hậu duệ D • Cây nút với tất hậu duệ CÁC THUẬT NGỮ CƠ BẢN (6) • Đường chuỗi nút n1, n2, , nk cho ni nút cha nút ni+1 (i=1 k-1) – VD: có đường A, D, I, O, Q • Độ dài đường số nút đường trừ – VD: độ dài đường A,D,I,O,Q = 5-1=4 • Chiều cao nút độ dài đường từ nút đến nút xa – VD: nút B có chiều cao 1, nút D có chiều cao • Chiều cao chiều cao nút gốc – VD: chiều cao CÁC THUẬT NGỮ CƠ BẢN (7) • Độ sâu nút độ dài đường từ nút gốc đến nút đó, hay gọi mức (level) nút – VD: I có độ sâu 2, E có độ sâu M, N, O, P có mức • Nhãn nút tên mà giá trị lưu trữ nút • Rừng tập hợp nhiều • Ví dụ: D P CÁC THUẬT NGỮ CƠ BẢN (8) • Cây có thứ tự – Nếu ta phân biệt thứ tự nút ta gọi có thứ tự Ngược lại, gọi thứ tự – Trong có thứ tự, thứ tự qui ước từ trái sang phải A A M C B H A G H B H H G CÁC THUẬT NGỮ CƠ BẢN (10) • Duyệt cây: D E siblings • Các nút nút cha gọi nút anh em ruột (siblings) • Mở rộng: ni nk hai nút anh em ruột nút ni bên trái nút nk hậu duệ nút ni bên trái hậu duệ nút nk C G CÁC THUẬT NGỮ CƠ BẢN (9) C C B G B A – Quy tắc: qua tất nút cây, nút lần – Danh sách duyệt cây: danh sách liệt kê nút theo thứ tự qua – Có phương pháp duyệt tổng quát: • tiền tự (preorder) • trung tự (inorder) • hậu tự (posorder) CÁC THUẬT NGỮ CƠ BẢN (11) • Định nghĩa theo đệ qui phép duyệt – Cây rỗng có nút: biểu thức duyệt rỗng hay có nút tương ứng – Ngược lại, giả sử T có nút gốc n T1, T2 , ,Tn thì: • Biểu thức duyệt tiền tự T nút n, biểu thức duyệt tiền tự T1, T2 , ,Tn theo thứ tự • Biểu thức duyệt trung tự T biểu thức duyệt trung tự T1, nút n đến biểu thức duyệt trung tự T2 , ,Tn theo thứ tự • Biểu thức duyệt hậu tự T biểu thức duyệt hậu tự T1, T2 , ,Tn theo thứ tự đến nút n CÁC THUẬT NGỮ CƠ BẢN (14) • Các giải thuật duyệt đệ qui void PREORDER(node n){ liệt kê nút n; for (mỗi c nút n theo thứ tự từ trái sang phải) PREORDER(c); } //PREORDER void INORDER(node n){ if (n nút lá) liệt kê nút n else { INORDER(con trái n) Liệt kê nút n; for(mỗi c nút n,trừ trái nhất, từ trái sang phải) INORDER(c); } } //INORDER CÁC THUẬT NGỮ CƠ BẢN (13) • Ví dụ A C B G D H T X E U Y =>Các biểu thức duyệt: • tiền tự: A B G H C D T X Y U E • trung tự: G B H A C X T Y D U E • hậu tự: G H B C X Y T U D E A CÁC THUẬT NGỮ CƠ BẢN (15) void POSORDER(node n){ if (n nút lá) Liệt kê nút n else { for (mỗi nút c nút n từ trái sang phải) POSORDER(c); Liệt kê nút n; } }; //POSORDER CÁC THUẬT NGỮ CƠ BẢN (16) • Cây có nhãn biểu thức Tên hàm (labeled trees and expression trees) * nhaîn n1 + n2 n4 Diển giải MAKENULL_TREE(T) Tạo T rỗng EMPTY(T) Kiểm tra xem T có rỗng không? ROOT(T) Trả nút gốc T PARENT(n, T) Trả cha nút n T LEFTMOST_CHILD(n, T) Trả trái nút n RIGHT_SIBLING(n, T) Trả anh em ruột phải nút n LABEL(n, T) Trả nhãn nút n CREATEi(v, T1, T2 , ,Ti) Tạo có nút gốc n nhãn v, có i Nếu n=0 có nút n + n3 nuït b a CÁC PHÉP TOÁN CƠ BẢN TRÊN CÂY n5 a n6 c n7 - Lưu trữ kết hợp nhãn (label) giá trị 1(value) với nút - Nhãn: giá trị lưu trữ nút đó, gọi khóa nút - VD: (a+b)*(a+c) CÁC PHƯƠNG PHÁP CÀI ĐẶT CÂY CÀI ĐẶT CÂY BẰNG MẢNG (1) • Mô hình A • CÀI ĐẶT CÂY BẰNG MẢNG • CÀI ĐẶT CÂY BẰNG DANH SÁCH CÁC NÚT CON B C • CÀI ĐẶT CÂY THEO PHƯƠNG PHÁP CON TRÁI NHẤT VÀ ANH EM RUỘT PHẢI • CÀI ĐẶT CÂY BẰNG CON TRỎ D E F G H CÀI ĐẶT CÂY BẰNG MẢNG (2) CÀI ĐẶT CÂY BẰNG MẢNG (3) • Khai báo #define Maxlength //chỉ số tối đa mảng #define NIL -1 typedef DataType; typedef int Node; typedef struct { DataType Data[Maxlength]; //Lưu trữ nhãn (dữ liệu) nút Node Parent[Maxlength]; /* Lưu trữ cha nút theo nguyên tắc: Cha nút i lưu vị trí i mảng */ int MaxNode; //Số nút thực } Tree; Tree T; CÀI ĐẶT CÂY BẰNG MẢNG (4) CÀI ĐẶT CÂY BẰNG MẢNG (5) • Khởi tạo rỗng • Xác định nhãn nút void MakeNull_Tree (Tree *T){ (*T).MaxNode=0; } // T->MaxNode=0; • Kiểm tra rỗng int EmptyTree(Tree T){ return T.MaxNode == 0;} • Xác định nút cha nút Node Parent(Node n,Tree T){ if(EmptyTree(T)||(n>T.MaxNode-1)) return NIL; else return T.Parent[n]; } DataType Label_Node(Node n,Tree T){ if(!EmptyTree(T)&&(n ... ĐẶT CÂY CÀI ĐẶT CÂY BẰNG MẢNG (1) • Mô hình A • CÀI ĐẶT CÂY BẰNG MẢNG • CÀI ĐẶT CÂY BẰNG DANH SÁCH CÁC NÚT CON B C • CÀI ĐẶT CÂY THEO PHƯƠNG PHÁP CON TRÁI NHẤT VÀ ANH EM RUỘT PHẢI • CÀI ĐẶT CÂY... CƠ BẢN (9) C C B G B A – Quy tắc: qua tất nút cây, nút lần – Danh sách duyệt cây: danh sách liệt kê nút theo thứ tự qua – Có phương pháp duyệt tổng quát: • tiền tự (preorder) • trung tự (inorder)... LabelType labels[maxlength]; node root; }TREE; CÀI ĐẶT CÂY THEO PHƯƠNG PHÁP CON TRÁI NHẤT VÀ ANH EM RUỘT PHẢI • Ví dụ HẾT PHẦN CÂY TỔNG QUÁT 36