Tham khảo tài liệu ''giáo trình hình thành ứng dụng phân tích thuật toán có thành phần dữ liệu newdata p1'', công nghệ thông tin, tin học văn phòng phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
h a n g e Vi e N y bu k lic GiáoBinT_Type trình hình thành ứng &BTree) dụng phân tích thuật tốn BinT_Initialize (BinT_Type { BTree = NULL; có thành phần liệu newdata return (BTree); } b Taïo nút: Thao tác hoàn toàn tương tự thao tác tạo nút danh sách liên kết đôi Giả sử cần tạo nút có thành phần liệu NewData - Thuật toán: B1: BTNode = new BinT_OneNode B2: IF (BTNode = NULL) Thực Bkt B3: BTNode->BinT_Left = NULL B4: BTNode->BinT_Right = NULL B5: BTNode->Key = NewData Bkt: Kết thúc - Cài đặt thuật toán: Hàm BinT_Create_Node có prototype: BinT_Type BinT_Create_Node(T NewData); Hàm tạo nút có thành phần liệu NewData, hàm trả trỏ trỏ tới địa nút tạo Nếu không đủ nhớ để tạo, hàm trả troû NULL BinT_Type BinT_Create_Node(T NewData) { BinT_Type BTnode = new BinT_OneNode; if (BTnode != NULL) { BTnode->BinT_Left = NULL; BTnode->BinT_Right = NULL; BTnode->Key = NewData; } return (BTnode); } - Minh họa thuật toán: Giả sử cần tạo nút có thành phần liệu 30: NewData = 30 BTnode = new BinT_OneNode BTnode BTnode->BinT_Left = NULL BTnode->BinT_Right = NULL Trang: 153 d o m w 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 w w w to to bu y N O W ! 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 BTnode 30 NULL NULL c Thêm nút vào nhị phân: Giả sử cần thêm nút có giá trị thành phần liệu NewData vào nhị phân Việc thêm diễn trái phải nhị phân Do vậy, trình bày thao tác thêm riêng biệt nhau: - Thuật toán thêm nút vào bên trái cây: B1: NewNode = BinT_Create_Node (NewData) B2: IF (NewNode = NULL) Thực Bkt B3: IF (BinTree = NULL) // Cây rỗng B3.1: BinTree = NewNode B3.2: Thực Bkt B4: Lnode = BinTree B5: IF (Lnode->BinT_Left = NULL) // Caây trái rỗng B5.1: Lnode->BinT_Left = NewNode B5.2: Thực Bkt B6: Lnode = Lnode->BinT_Left // Đi theo nhánh trái B7: Lặp lại B5 Bkt: Kết thúc - Minh họa thuật toán: Giả sử cần thêm nút có thành phần liệu 17 vào bên trái nhị phân: NewData = 17 NewNode BinTree 17 NULL 20 NULL Lnode 25 45 19 NULL 16 NULL NULL NULL 30 NULL 21 NULL NULL NULL Trang: 154 d o m w BTnode->Key = NewData 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 O W N y bu k lic NewNode BinTree 17 NULL 20 NULL Lnode 25 45 19 16 NULL NULL 30 NULL NULL 21 NULL NULL NULL Kết sau theâm: BinTree 20 Lnode NewNode 45 19 17 NULL 25 16 NULL NULL NULL NULL 30 NULL 21 NULL NULL NULL - Cài đặt thuật toán: Hàm BinT_Add_Left có prototype: BinT_Type BinT_Add_Left(BinT_Type &BT_Tree, T NewData); Hàm thực việc thêm vào bên trái nhị phân BT_Tree nút có thành phần liệu NewData, hàm trả trỏ trỏ tới địa nút thêm việc thêm thành công, ngược lại không đủ nhớ, hàm trả trỏ NULL BinT_Type BinT_Add_Left(BinT_Type &BT_Tree, T NewData) { BinT_Type NewNode = BinT_Create_Node(NewData); if (NewNode == NULL) return (NewNode); if (BT_Tree == NULL) Trang: 155 d o m w B5.1: Lnode->BinT_Left = NewNode 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 O W N y bu k lic } - Thuật toán thêm nút vào bên phải nhị phân: B1: NewNode = BinT_Create_Node (NewData) B2: IF (NewNode = NULL) Thực Bkt B3: IF (BinTree = NULL) // Cây rỗng B3.1: BinTree = NewNode B3.2: Thực hieän Bkt B4: Rnode = BinTree B5: IF (Rnode->BinT_Right = NULL) // Cây phải rỗng B5.1: Rnode->BinT_Right = NewNode B5.2: Thực Bkt B6: Rnode = Rnode->BinT_Right // Đi theo nhánh phải B7: Lặp lại B5 Bkt: Kết thúc - Minh họa thuật toán: Giả sử cần thêm nút có thành phần liệu 21 vào bên phải nhị phân: NewData = 21 BinTree NewNode 40 Rnode 36 12 NULL 55 18 NULL NULL 21 45 NULL NULL NULL NULL NULL 10 NULL NULL 11 NULL NULL NULL Trang: 156 d o m w BT_Tree = NewNode; else { BinT_Type Lnode = BT_Tree; while (Lnode->BinT_Left != NULL) Lnode = Lnode->BinT_Left; Lnode->BinT_Left = NewNode; } return (NewNode); 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 O W N y bu k lic BinTree NewNode 40 Rnode 36 55 12 NULL 21 18 NULL NULL 45 NULL NULL NULL 10 NULL NULL NULL 11 NULL NULL NULL NULL Kết sau thêm: BinTree 40 Rnode 36 12 NULL 55 18 NULL NULL NewNode 45 NULL 21 10 NULL NULL NULL NULL 11 NULL NULL NULL NULL - Cài đặt thuật toán: Hàm BinT_Add_Right có prototype: BinT_Type BinT_Add_Right(BinT_Type &BT_Tree, T NewData); Hàm thực việc thêm vào bên phải nhị phân BT_Tree nút có thành phần liệu NewData, hàm trả trỏ trỏ tới địa nút thêm việc thêm thành công, ngược lại không đủ nhớ, hàm trả trỏ NULL BinT_Type BinT_Add_Right(BinT_Type &BT_Tree, T NewData) Trang: 157 d o m w B5.1: Rnode->BinT_Right = NewNode o m o c C k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuaä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 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 Duyệ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 Thuaä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 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 Thuaä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 baèng 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 Bkt B2: NNL = NN(BinTree->BinT_Left) B3: NNR = NN(BinTree->BinT_Right) B4: NN = NNL + NNR + Bkt: Kết thúc Ví dụ: Số nút nhị phân sau 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 ... Thêm nút vào nhị phân: Giả sử cần thêm nút có giá trị thành phần liệu NewData vào nhị phân Việc thêm diễn trái phải nhị phân Do vậy, trình bày thao tác thêm riêng biệt nhau: - Thuật toán thêm nút... - Cài đặt thuật toán: Hàm BinT_Add_Left có prototype: BinT_Type BinT_Add_Left(BinT_Type &BT_Tree, T NewData) ; Hàm thực việc thêm vào bên trái nhị phân BT_Tree nút có thành phần liệu NewData, hàm... Cài đặt thuật toán: Hàm BinT_Add_Right có prototype: BinT_Type BinT_Add_Right(BinT_Type &BT_Tree, T NewData) ; Hàm thực việc thêm vào bên phải nhị phân BT_Tree nút có thành phần liệu NewData,