Tham khảo tài liệu ''giáo trình phân tích quy trình ứng dụng thuật toán có thành phần dữ liệu newdata p2'', công nghệ thông tin, cơ sở dữ liệu phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
O W w N y bu to c w { BinT_Type NewNode = BinT_Create_Node(NewData); if (NewNode == NULL) return (NewNode); if (BT_Tree == NULL) BT_Tree = NewNode; else { BinT_Type Rnode = BT_Tree; while (Rnode->BinT_Right != NULL) Rnode = Rnode->BinT_Right; Rnode->BinT_Right = NewNode; } return (NewNode); } d Duyeät qua nút nhị phân: Trong thao tác tìm cách duyệt qua (ghé thăm) tất nút nhị phân để thực thao tác xử lý nút (Xem nội dung thành phần liệu chẳng hạn) Căn vào thứ tự duyệt nút gốc so với nút gốc con, thao tác duyệt thực theo ba thứ tự: - Duyệt theo thứ tự nút gốc trước (Preorder): Theo cách duyệt nút gốc duyệt trước sau duyệt đến hai Căn vào thứ tự duyệt hai mà có hai cách duyệt theo thứ tự nút gốc trước: + Duyệt nút gốc, duyệt trái, duyệt phải (Root – Left – Right) + Duyệt nút gốc, duyệt phải, duyệt trái (Root – Right - Left) - Duyệt theo thứ tự nút gốc (Inorder): Theo cách duyệt duyệt hai trước đến duyệt nút gốc sau duyệt lại Căn vào thứ tự duyệt hai có hai cách duyệt theo thứ tự nút gốc giữa: + Duyệt trái, duyệt nút gốc, duyệt phải (Left – Root - Right) + Duyệt phải, duyệt nút gốc, duyệt trái (Right – Root - Left) - Duyệt theo thứ tự nút gốc sau (Postorder): Tương tự duyệt theo nút gốc trước, cách duyệt nút gốc duyệt sau so với duyệt hai nút gốc Do vậy, vào thứ tự duyệt hai mà có hai cách duyệt theo thứ tự nút gốc sau: + Duyệt trái, duyệt phải, duyệt nút gốc (Left – Right - Root) + Duyệt phải, duyệt trái, duyệt nút gốc (Right – Left - Root) Trong phần trình bày cách duyệt theo thứ tự cụ thể là: Duyệt trái, duyệt nút gốc duyệt phải (Left – Root – Right) sử dụng thuật toán đệ quy Các cách duyệt khác thuật toán đệ quy hay không đệ quy sinh viên tự vận dụng tương tự - Thuật toán đệ quy để duyệt nhị phân theo thứ tự Left – Root – Right (LRootR): B1: CurNode = BinTree Trang: 158 d o m C lic k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật o o c u -tr a c k w w d o m C lic k to bu y N w w w h a n g e Vi e ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c u -tr a c k c O W N y bu k lic - Minh họa thuật toán: Giả sử cần duyệt qua nút nhị phân theo thứ tự Left – Root – Right: BinTree 40 36 12 NULL 55 18 NULL NULL 45 NULL NULL 21 10 NULL NULL NULL 11 NULL NULL NULL NULL LRootR(BinTree->BinT_Left) LRootR(BinTree->BinT_Left->BinT_Left) LRootR(NULL) Process(12) LRootR(NULL) Process(36) LRootR(BinTree->BinT_Left->BinT_Right) LRootR(NULL) Process(18) LRootR(NULL) Process(40) LRootR(BinTree->BinT_Right) LRootR(BinTree->BinT_Right->BinT_Left) LRootR(BinTree->BinT_Right->BinT_Left->BinT_Left) LRootR(NULL) Process(10) LRootR(NULL) Trang: 159 d o m w B2: IF (CurNode = NULL) Thực Bkt B3: LRootR (BinTree->BinT_Left) // Duyệt trái B4: Process (CurNode->Key) // Xử lý thông tin nút gốc B5: LRootR (BinTree->BinT_Right) // Duyệt phải Bkt: Kết thúc o m o c C k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật lic C c u -tr a c k w w d o w to to bu y N w w w h a n g e Vi e ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c u -tr a c k c c u -tr a c k O W N y bu k lic Process(45) LRootR(BinTree->BinT_Right->BinT_Left->BinT_Right) LRootR(BinTree->BinT_Right->BinT_Left->BinT_Right->BinT_Left) LRootR(NULL) Process(11) LRootR(NULL) Process(8) LRootR(BinTree->BinT_Right->BinT_Left->BinT_Right->BinT_Right) LRootR(NULL) Process(5) LRootR(NULL) Process(55) LRootR(BinTree->BinT_Right->BinT_Right) LRootR(NULL) Process(21) LRootR(NULL) Như thứ tự thông tin nút xử lý sau: 12 -> 36 -> 18 -> 40 -> 10 -> 45 -> 11 -> -> -> 55 -> 21 - Cài đặt thuật toán: Hàm BinT_LRootR_Travelling có prototype: void BinT_LRootR_Travelling(BinT_Type BT_Tree); Hàm thực thao tác duyệt qua tất nút nhị phân BT_Tree theo thứ tự duyệt Left – Root – Right để xử lý thông tin nút void BinT_LRootR_Travelling(BinT_Type BT_Tree) { if (BT_Tree == NULL) return; BinT_LRootR_Travelling (BT_Tree->BinT_Left); Process (BT_Tree->Key) BinT_LRootR_Travelling (BT_Tree->BinT_Right); return; } Löu ý: Hàm Process thực việc xử lý thông tin (Key) nút Do tùy trường hợp cụ thể mà viết hàm cho phù hợp Chẳng hạn để xuất thông tin cần lệnh xuất liệu để xuất thành phần Key e Tính chiều cao cây: Để 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) - Thuật toaùn: Trang: 160 d o m o c C w o m C lic k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật w w d o w to to bu y N w w w h a n g e Vi e ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c u -tr a c k c O W N y bu k lic Ví dụ: Chiều cao nhị phân sau BinTree 40 36 55 12 18 45 21 NULL NULL NULL NULL NULL NULL NULL NULL NULL - Cài đặt thuật toán: Hàm BinT_Height có prototype: int BinT_Height(BinT_Type BTree); Hàm tính chiều cao BTree theo thuật toán đệ quy Hàm trả chiều cao cần tính int BinT_Height(BinT_Type BTree) { if (BTree == NULL) return (0); int HTL = BinT_Height(BTree->BinT_Left); int HTR = BinT_Height(BTree->BinT_Right); if (HTL > HTR) return (HTL+1); return (HTR+1); } f Tính số nút cây: Tương tự tính chiều cao cây, số nút (NN) tổng số nút hai cộng thêm Do thao tác tính đệ quy số nút (số nút có gốc nút 1) Trang: 161 d o m w B1: IF (BinTree = NULL) B1.1: TH = B1.2: Thực Bkt B2: THL = TH(BinTree->BinT_Left) B3: THR = TH(BinTree->BinT_Right) B4: IF (THL > THR) TH = THL + B5: ELSE TH = THR + Bkt: Kết thúc o m o c C k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật lic C c u -tr a c k w w d o w to to bu y N w w w h a n g e Vi e ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c u -tr a c k c c u -tr a c k O W N y bu k lic - Thuật toán: B1: IF (BinTree = NULL) B1.1: NN = B1.2: Thực hieän Bkt B2: NNL = NN(BinTree->BinT_Left) B3: NNR = NN(BinTree->BinT_Right) B4: NN = NNL + NNR + Bkt: Keát thúc Ví dụ: Số nút nhị phân sau baèng BinTree 40 36 55 12 NULL 18 NULL NULL 1(0+0+1) 45 NULL NULL 0 (0+0+1) (1+1+1) 21 NULL NULL NULL 0 (0+0+1) (0+1+1) (2+1+1) (3+4+1) NULL (0+0+1) - Cài đặt thuật toán: Hàm BinT_Num_Node có prototype: int BinT_Num_Node(BinT_Type BTree); Hàm tính số nút BTree theo thuật toán đệ quy Hàm trả số nút cần tính int BinT_Num_Node(BinT_Type BTree) { if (BTree == NULL) return (0); int NNL = BinT_Num_Node(BTree->BinT_Left); int NNR = BinT_Num_Node(BTree->BinT_Right); return (NNL + NNR + 1); } g Hủy nút nhị phân: Việc hủy nút làm cho trở thành rừng Do thao tác tiến hành hủy nút điều xảy ra, song hủy Trang: 162 d o m o c C w o m C lic k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật w w d o w to to bu y N w w w h a n g e Vi e ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c u -tr a c k c ... 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) - Thuật toán: Trang: 160 d o m o c C w o m C lic k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật w w d o w to to bu y N w w... g Hủy nút nhị phân: Việc hủy nút làm cho trở thành rừng Do thao tác tiến hành hủy nút điều xảy ra, song hủy Trang: 162 d o m o c C w o m C lic k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật w w d o... (2+1+1) (3+4+1) NULL (0+0+1) - Cài đặt thuật toán: Hàm BinT_Num_Node có prototype: int BinT_Num_Node(BinT_Type BTree); Hàm tính số nút BTree theo thuật toán đệ quy Hàm trả số nút cần tính int BinT_Num_Node(BinT_Type