tài liệu uy tín được biên soạn bởi giảng viên đại học Bách Khoa TPHCM, thuận lợi cho qua trình tự học, nghiên cứu bộ tự động hóa, điện tử, cơ điện tử, cơ khí chế tạo máy, lập trình nhúng, Tài liệu được kiểm duyệt bởi giảng viên, phòng đào tạo trường đại học bách khoa, lưu hành nội bộ
Chương Cây Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT Nội dung Ðịnh nghĩa thuật ngữ Các phép duyệt Một số ứng dụng Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT Các định nghĩa Định nghĩa f Cây (tree) tập hợp gồm nhiều phần tử, phần tử gọi nút (node), đó: y y Một nút gọi nút gốc (root) Các nút lại chia thành m ≥ nhóm, nhóm gọi (subtree) f Một nút gọi rỗng Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT Các định nghĩa Bậc nút bậc f Bậc nút số nút f Bậc bậc lớn tất nút f Một có bậc n gọi n-phân (narity tree) f Cây nhị phân có bậc Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT Các định nghĩa Nút trung gian nút f Nút trung gian nút có bậc khác khơng nút gốc f Nút nút có bậc không nút gốc Mức nút chiều cao f Mức nút gốc f Mức nút khác nút gốc mức nút gốc nhỏ chứa nút cộng f Chiều cao mức lớn tất nút Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT Các định nghĩa Nút trước nút sau f Nút y nút trước nút x nút y gốc có chứa nút x; nút x gọi nút sau nút y Nút cha, nút nút anh em f Nút y nút cha nút x nút y nút trước nút x mức nút x mức nút y cộng 1; nút x gọi nút nút y f Nút x nút y hai nút anh em chúng có nút cha Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT Các định nghĩa Mức A Mức Mức Mức B C G H D E I F Bậc A 2, bậc C Cây gốc A nhị phân (bậc 2) A nút gốc, nút cha B, nút trước D, có mức B nút trung gian, nút A, có mức C nút là, nút anh em với D Chiều cao gốc A Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT Các phép duyệt Phép duyệt trình đến tất nút f Nhiều toán giải phép duyệt (dùng giải thuật đệ quy có cấu trúc đệ quy) f Ký hiệu: y y y N nút gốc L bên trái R bên phải Phép duyệt thứ tự đầu: NLR NRL Phép duyệt thứ tự giữa: LNR RNL Phép duyệt thứ tự cuối: LRN RLN Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT Các phép duyệt Root A N p B C G H D E p^.left p^.right R L I F Thứ tự đầu NLR: A B C D E F G H I NRL: A G I H B D F E C Thứ tự LNR: C B E D F A H G I RNL: I G H A F D E B C Thứ tự cuối LRN: C E F D B H I G A RLN: I H G F E D C B A Duyệt theo mức A B G C D H I E F Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT Định nghĩa cấu trúc nhị phân Ví dụ: type ref = ^node; node = record info: integer; left, right: ref end; var Root: ref; Chương Cây info left 2006 right Nguyễn Trung Trực - Khoa CNTT 10 Các phép duyệt Thứ tự duyệt NLR (đệ quy) procedure Traversing_NLR (p: ref); begin if p nil then begin writeln (p^.info); {N} Traversing_NLR (p^.left); {L} Traversing_NLR (p^.right); {R} end end; Lệnh gọi: Traversing_NLR (Root); Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT 11 Các phép duyệt Thứ tự duyệt LNR (đệ quy) procedure Traversing_LNR (p: ref); begin if p nil then begin Traversing_LNR (p^.left); {L} writeln (p^.info); {N} Traversing_LNR (p^.right); {R} end end; Lệnh gọi: Traversing_LNR (Root); Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT 12 Các phép duyệt Thứ tự duyệt LRN (đệ quy) procedure Traversing_LRN (p: ref); begin if p nil then begin Traversing_LRN (p^.left); {L} Traversing_LRN (p^.right); {R} writeln (p^.info); {N} end end; Lệnh gọi: Traversing_LRN (Root); Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT 13 Các phép duyệt Thứ tự duyệt theo mức f Từ trái qua phải, từ xuống type qptr = ^queue_item; queue_item = record info: ref; next: qptr end; queue_type = record front, rear: qptr end; Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT 14 Các phép duyệt Thứ tự duyệt theo mức procedure Queue_Init (var Queue: queue_type); begin Queue.front = nil; Queue.rear := nil end; function Queue_Empty (Queue: queue_type): boolean; begin Queue_Empty := Queue.front = nil; end; Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT 15 Các phép duyệt Thứ tự duyệt theo mức procedure Queue_Insert (var Queue: queue_type; x: ref); var p: qptr; begin new(p); p^.info := x, p^.next := nil; if Queue.rear = nil then Queue.front := p else Queue.rear^.next := p; Queue.rear := p end; Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT 16 Các phép duyệt Thứ tự duyệt theo mức procedure Queue_Delete (var Queue: queue_type; var x: ref); var p: qptr; begin p := Queue.front; Queue.front := p^.next; x := p^.info; if Queue.front = nil then Queue.rear := nil; dispose(p) end; Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT 17 Các phép duyệt Thứ tự duyệt theo mức procedure Traversing_Level (p: ref); var Queue: queue_type; begin Queue_Init (Queue); if p nil then Queue_Insert (Queue, p); while not Queue_Empty (Queue) begin Queue_Delete (Queue, p); writeln (p^.info); if p^.left nil then Queue_Insert (Queue, p^.left); if p^.right nil then Queue_Insert (Queue, p^.right); end end; Chương Cây 2006 Nguyễn Trung Trực - Khoa CNTT 18 Một số ứng dụng Tạo procedure Tree_Create (var p: ref); {Tạo gốc p gồm nút chứa số nguyên dương - Dùng phép duyệt NLR} var n: integer; begin write (‘Nhap nut: ‘); readln(n); if n