Định nghĩa: Cây là một tập hợp hữu hạn các nút, trong đó có một nút đặc biệt gọi là gốc (Root). Giữa các nút có một quan hệ phân cấp gọi là quan hệ cha con. * Một cây không có nút nào gọi là cây rỗng (Null tree). * Các ví dụ về cây: Ví dụ 1: Mục lục của một chương được biểu diễn dạng cây.
Bài (6 tiết): CÂY (TREE) A CÂY VÀ CÂY NHỊ PHÂN (2 tiết) 1.Các khái niệm 1.1 Định nghĩa * Định nghĩa: Cây 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ó quan hệ phân cấp gọi quan hệ cha * Một khơng có nút gọi rỗng (Null tree) * Các ví dụ cây: Ví dụ 1: Mục lục chương biểu diễn dạng Vd2: Biểu thức toán học: x+y*(z-t)+u/v Ví dụ 3: Ví dụ 4: 1.2 Các khái niệm * Gốc (Root): Gốc nút đặc biệt khơng có cha * Cấp (Degree) : Số nút gọi cấp nút * Lá (leaf): Nút có cấp khơng gọi hay nút tận * Nút nhánh (branch node) : Nút không gọi nút nhánh * Mức (Level): Gốc có mức Nếu nút cha có mức i nút có mức i+1 * Chiều cao (Height) hay chiều sâu (Depth) : Là số mức lớn của nút có * Đường (Path) : Nếu n1, n2, , nk dãy nút mà ni là cha ni+1 (1≤iBinT_Right = NewNode Kết sau thêm: 2.2 c Thêm nút vào nhị phân (Thêm phải nhất) Cài đặt thuật toán C++ BinTType BinTreeAddRight (BinTType &BTTree, T NewData) { BinTType NewNode = BinTreeCreateNode (NewData); if (NewNode == NULL) return (NewNode); if (BTTree == NULL) BTTree = NewNode; else { BinTType Rnode = BTTree; while (Rnode->BinTRight != NULL) Rnode = Rnode->BinTRight; Rnode->BinTRight = NewNode; } return (NewNode); } 2.2 d Duyệt qua nút nhị phân • • • Duyệt theo thứ tự nút gốc trước (Preoder): Duyệt nút gốc, duyệt bên trái, duyệt bên phải (Node - Left - Right) Duyệt theo thứ tự nút gốc (Inoder): Duyệt bên trái, duyệt nút gốc, duyệt bên phải (Left - Node - Right) Duyệt theo thứ tự nút gốc sau (Postoder): Duyệt bên trái, duyệt bên phải, duyệt nút gốc(Left – Right - Node) 2.2 d Thuật toán duyệt qua nút viết dạng đệ quy Thuật toán duyệt theo thứ tự trước B3: LNR(BinTree->BinTLeft) B1: CurrNode = BinTree B4: Process (CurrNode->Key) B2: IF (CurrNode == NULL) B5: LNR(BinTree->BinTRight) Thực BKT BKT: Kết thúc B3: Process (CurrNode->Key) Thuật toán duyệt theo thứ tự sau B4: NLR(BinTree->BinTLeft) B1: CurrNode = BinTree B5: NLR(BinTree->BinTRight) B2: IF (CurrNode == NULL) BKT: Kết thúc Thực BKT Thuật toán duyệt theo thứ tự B3: LRN(BinTree->BinTLeft) B1: CurrNode = BinTree B4: LRN(BinTree->BinTRight) B2: IF (CurrNode == NULL) B5: Process (CurrNode->Key) Thực BKT BKT: Kết thúc - Minh họa thuật tốn: • Giả sử cần duyệt qua nút nhị phân theo thứ tự trước(Preorder): Node – Left - Right: 40 -> 36 -> 12 -> 18 -> 55 -> 45 -> 10 -> -> 11 -> -> 21 - Minh họa thuật tốn: • Giả sử cần duyệt qua nút nhị phân theo thứ tự giữa(Inorder): Left – Node – Right: 12 -> 36 -> 18 -> 40 -> 10 -> 45 -> 11 -> -> -> 55 -> 21 - Minh họa thuật tốn: • Giả sử cần duyệt qua nút nhị phân theo thứ tự sau(Postorder): Left – Right - Node: 12 -> 18 -> 36 ->10 ->11 -> -> -> 45 -> 21->55->40 2.2 e Tính chiều cao • Để tính chiều cao (TH) phải tính chiều cao con, chiều cao chiều cao lớn cộng thêm (chiều cao nút gốc) Như thao tác tính chiều cao thao tác tính đệ quy chiều cao (chiều cao có gốc nút 1) B1: IF (BinTree == NULL) B1.1: TH = B1.2: Thực BKT B2: THL = TH(BinTree->BinTLeft) B3: THR = TH(BinTree->BinTRight) B4: IF(THL > THR) TH = THL + B5: ELSE TH = THR + BKT: Kết thúc int BinTreeHeight (BinTType BTree) { if (BTree == NULL) return (0); int HTL = BinTreeHeight(BTree -> BinTLeft); int HTR = BinTreeHeight(BTree -> BinTRight); if (HTL > HTR) return (HTL +1) else return (HTR +1); } Ví dụ: Chiều cao nhị phân sau 2.2 f Tính số nút Tính số nút tương tự tính chiều cao cây, số nút + Dùng cách tính đệ quy số nút B1: IF (BinTree == NULL) B1.1: NN = B1.2: Thực BKT B2: NNL = NN(BinTree->BinTLeft) B3: NNR = NN(BinTree->BinTRight) B4: NN = NNR + NNL + BKT: Kết thúc int BinTreeNumNode (BinTType BTree) { if (BTree == NULL) return (0); int NNL = BinTreeNumNode(BTree -> BinTLeft); int NNR = BinTreeNumNode(BTree -> BinTRight); return (NNL + NNR +1); } Ví dụ: Số nút nhị phân sau 2.2 g Hủy nút nhị phân • Việc hủy nút làm cho trở thành rừng • Nếu tiến hành hủy nút khơng có vấn đề xảy • Nếu hủy nút khơng phải nút cần phải chuyển nút nút cần hủy qua nút khác tiến hành hủy • Nếu nút cần hủy có nút gốc chuyển nút gốc thành nút gốc cha nút cần hủy • Trong trường hợp nút cần hủy có nút gốc con, phải chuyển nút gốc thành nút gốc nút khác Tuỳ trường hợp cụ thể mà đưa cách chọn phù hợp Bài tập: Cho nhị phân sau: - Duyệt nhị phân theo cách H ... tối đa Ví dụ sau nhị phân hồn chỉnh : Cây nhị phân đầy đủ : Là nhị phân có nút tối đa mức Ví dụ sau nhị phân đầy đủ : A C B D E F G Tính chất: • a- Số lượng tối đa nút mức i nhị phân 2i-1 (i≥1)... lý nhị phân cần quản lý địa nút gốc BinTType BinTree; 2.2 Biểu diễn thao tác (tt) Các thao tác nhị phân bao gồm: a Khởi tạo nhị phân b Tạo nút c Thêm nút vào nhị phân d Duyệt qua nút nhị phân. .. hạn phân biệt ta gọi tập rừng 2 Cây nhị phân 2.1 Định nghĩa tính chất * Định nghĩa: Cây nhị phân dạng đặc biệt cấu trúc cây, nút có tối đa * Đối với nút người ta phân biệt trái phải Như nhị phân