CHƢƠNG MƠ HÌNH DỮ LIỆU CÂY © nuinvtnu-2017 Data structures and Algorithms Chapter - 1/23 CÂY TỔNG QUÁT Cây tổng quát hay gọi đa phân – gọi tắt Đinh nghĩa: Tập có đỉnh cây, có gốc đỉnh Giả sử T1 , T2 , , Tk (k 1) có gốc tương ứng r1, r2, , rk ; T1 , T2 , , Tk đôi không cắt Nếu r đỉnh không thuộc T1 , T2 , , Tk tập T gồm đỉnh r tất đỉnh Ti làm thành gốc r © nuinvtnu-2017 Data structures and Algorithms Chapter - 2/23 Cây tổng quát Như vậy: bao gồm tập hữu hạn đỉnh, có đỉnh đặc biệt gọi gốc (root) Giữa đỉnh có quan hệ phân cấp gọi quan hệ cha - Nếu a đỉnh gốc con, b gốc đỉnh a ta nói a đỉnh cha cịn b đỉnh Các khái niệm cây: Nếu tập đỉnh = rỗng => Cây rỗng Bậc đỉnh: Số đỉnh gọi bậc đỉnh Đỉnh có bậc = gọi (đỉnh tận cùng), đỉnh không gọi đỉnh Đỉnh anh em: Các đỉnh có cha (xét từ trái sang phải) Rừng: Tập phân biệt © nuinvtnu-2017 Data structures and Algorithms Chapter - 3/23 Cây tổng quát Mức: Gốc có mức (level = 0) Nếu đỉnh cha có mức i đỉnh có mức i+1 Chiều cao cây: (height) số mức lớn đỉnh có Đƣờng đi: Một dãy đỉnh a1, a2, , an (n>0) cho cha ai+1 gọi đường từ a1 đến an với độ dài n-1 Luôn tồn đường từ gốc đến đỉnh Cây đƣợc sắp: Là mà đỉnh xếp theo thứ tự Nếu đỉnh a có đỉnh b1, b2, , bm theo thứ tự ta nói b1 trưởng b2 em liền kề © nuinvtnu-2017 Data structures and Algorithms Chapter - 4/23 Cây tổng quát Các phép toán cây: Giả sử, xét gốc T PARENT(n): trả nút cha nút n T, n nút gốc hàm cho giá trị $ ELDEST_CHILD(n): cho nút trái nút n T, n hàm cho giá trị $ NEXT_SIBLING(n): cho nút anh em ruột phải nút n T, n khơng có anh em ruột phải hàm cho giá trị $ value(n) Trả giá trị lưu nút n T Duyệt cây: Traverser/Visit © nuinvtnu-2017 Data structures and Algorithms Chapter - 5/23 Thăm ( duyệt) Duyệt cây: Là phép thăm tất đỉnh cây, cho đỉnh thăm lần Ba phương pháp duyệt bản: Duyệt theo thứ tự trước - Preorder(T) Duyệt theo thứ tự - Inorder(T) Duyệt theo thứ tự sau - Postorder(T) © nuinvtnu-2017 Data structures and Algorithms Chapter - 6/23 Duyệt theo thứ tự trƣớc Duyệt theo thứ tự trước: Thứ tự duyệt sau: Nếu rỗng: => thông báo rỗng Ngược lại: Thăm gốc Thăm T1, T2, T3, , Tn theo thứ tự trước => Gốc T1 T2 T3 Tn Ví dụ: © nuinvtnu-2017 Data structures and Algorithms Chapter - 7/23 Duyệt theo thứ tự trƣớc Giải thuật: void PreOrder(Tree T) { NodeType C; Visit(T); // thăm gốc C= EldestChild(T); // Con T while(C!=$) { PreOrder(C); C= NextSibling(T); } } © nuinvtnu-2017 Data structures and Algorithms Chapter - 8/23 Duyệt theo thứ tự (InOrder) Nguyên tắc duyệt theo thứ tự giữa: Nếu rỗng: Thông báo rỗng không duyệt Ngược lại thứ tự duyệt sau: Duyệt thứ T1 theo thứ tự Thăm gốc T Duyệt lại T2, T3, , Tn theo thứ tự Ví dụ © nuinvtnu-2017 Data structures and Algorithms Chapter - 9/23 Duyệt theo thứ tự Giải thuật: void InOrder (Tree T) { NodeType C; C= EldestChild(T); // Con T if( C!= $) { InOrder(C); C = NextSibling(C); } Visit(T); while (C!=$) { InOrder(C); C = NextSibling(C); } } © nuinvtnu-2017 Data structures and Algorithms Chapter - 10/23 Duyệt theo thứ tự sau Nguyên tắc duyệt theo thứ tự sau: Nếu rỗng: thông báo rỗng không duyệt Ngược lại thứ tự duyệt sau: Thăm T1, T2, T3, , Tn theo thứ tự sau Thăm gốc T © nuinvtnu-2017 Data structures and Algorithms Chapter - 11/23 Duyệt theo thứ tự sau * Giải thuật: void PostOrder(Tree T){ NodeType C; C = EldestChild (T); //con while (C != $) { PostOrder (C); C = NextSibling (C); //em liền kề } Visit (T); //Thăm cha } © nuinvtnu-2017 Data structures and Algorithms Chapter - 12/23 Cài đặt Các phương pháp biểu diễn cây: Biểu diễn danh sách đỉnh Biểu diễn trƣởng em liền kề đỉnh Biểu diễn cha đỉnh © nuinvtnu-2017 Data structures and Algorithms Chapter - 13/23 Biểu diễn danh sách đỉnh © nuinvtnu-2017 Data structures and Algorithms Chapter - 14/23 Biểu diễn cha đỉnh © nuinvtnu-2017 Data structures and Algorithms Chapter - 15/23 Biểu diễn trƣởng em liền kề Mô tả phƣơng pháp biểu diễn: Mỗi đỉnh cần lưu trữ thông tin: Dữ liệu đỉnh (infor) Con trưởng đỉnh (EldestChild): Lưu ID Em liền kề đỉnh (NextSibling) : Lưu ID Mỗi đỉnh, cịn gọi nút xem cấu trúc gồm trường: infor, EldestChild, NextSibling Các đỉnh tổ chức lưu trữ mảng gồm tối đa n phần tử lưu trữ dạng móc nối © nuinvtnu-2017 Data structures and Algorithms Chapter - 16/23 Biểu diễn trƣởng em liền kề Biểu diễn mảng Các đỉnh tổ chức lưu trữ mảng gồm tối đa n phần tử Mỗi đỉnh tổ chức lưu trữ cấu trúc gọi nút Ví dụ: Xét hình ảnh sau biểu diễn © nuinvtnu-2017 Data structures and Algorithms Chapter - 17/23 Biểu diễn trƣởng em liền kề Biểu diễn mảng Dạng biểu diễn: # define N struct Node { item Infor; int EldestChild; int NextSibling; }; typedef struct Tree { Node Elements[N]; }; Tree T; © nuinvtnu-2017 Data structures and Algorithms Chapter - 18/23 Biểu diễn trƣởng em liền kề Cài đặt số phép toán Tìm cha đỉnh thứ k T: + Duyệt đỉnh cây, xuất phát từ gốc (i =1), kiểm tra xem trưởng J i có = k hay khơng? Nếu có => i cha cần tìm + Ngược lại, kiểm tra em liền kề trưởng J có k hay khơng Nếu i là cần tìm Nếu khơng, kiểm tra J em liền kề J cũ.cứ tiếp tục kiểm tra hết i mà khơng có = k duyệt đỉnh i cây, ngược lại dừng việc tìm kiếm kết luận i đỉnh cha cần tìm © nuinvtnu-2017 Data structures and Algorithms Chapter - 19/23 Biểu diễn trƣởng em liền kề Giải thuật: © nuinvtnu-2017 int Parent(Tree T, int k) { int i=0,j, found = 0; While (( i Mỗi đỉnh xem cấu trúc gồm trường: Infor, EldestChild, NextSibling Cấu trúc nút có dạng sau: EldestChild Infor NextSibling - Các đỉnh tổ chức lưu trữ móc nối thơng qua chế lưu địa © nuinvtnu-2017 Data structures and Algorithms Chapter - 21/23 Biểu diễn trƣởng em liền kề Cài đặt trỏ Dạng cài đặt struct Node{ item Infor; struct Node *EldestChild; struct Node *NextSibling; }; typedef struct Node *Tree; Tree root; © nuinvtnu-2017 Data structures and Algorithms Chapter - 22/23 Biểu diễn trƣởng em liền kề Ví dụ: © nuinvtnu-2017 Data structures and Algorithms Chapter - 23/23