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 p3

10 8 0
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 p3

Đang tải... (xem toàn văn)

Thông tin tài liệu

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 p3'', 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ả

O W w N y bu to c Hàm thực việc thêm vào nhị phân tìm kiếm BS_Tree nút có thành phần Key NewData Hàm trả trỏ trỏ tới địa nút thêm việc thêm thành công, trường hợp ngược lại hàm trả trỏ NULL BST_Type BST_Add_Node(BST_Type &BS_Tree, T NewData) { BST_Type NewNode = BinT_Create_Node(NewData); if (NewNode == NULL) return (NewNode); if (BS_Tree == NULL) BS_Tree = NewNode; else { BST_Type CurNode = BS_Tree; int AddLeft = 1; while (CurNode->Key != NewData) { if (CurNode->Key > NewData) { AddLeft = 1; if (CurNode->BST_Left != NULL) CurNode = CurNode->BST_Left; else break; } else // CurNode->Key < NewData { AddLeft = 0; if (CurNode->BST_Right != NULL) CurNode = CurNode->BST_Right; else break; } } if (AddLeft == 1) CurNode->BST_Left = NewNode; else CurNode->BST_Right = NewNode; } return (NewNode); } c Loaïi bỏ (hủy) nút cây: Cũng thao tác thêm nút vào nhị phân tìm kiếm, thao tác hủy nút nhị phân tìm kiếm phải bảo đảm cho sau hủy nút nhị phân tìm kiếm Đây thao tác không đơn giản không cẩn thận biến thành rừng Giả sử cần hủy nút có thành phần liệu (Key) DelData khỏi nhị phân tìm kiếm Điều thao tác phải tìm kiếm địa nút cần hủy DelNode, sau tiến hành hủy nút có địa DelNode tìm thấy (Do thuật toán gọi thuật toán tìm kiếm loại bỏ cây) Quá trình tìm kiếm trình bày trên, trình bày thao Trang: 173 w 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 tác hủy tìm thấy nút có địa DelNode (DelNode->Key = DelData) trình tìm kiếm giữ địa nút cha nút cần hủy PrDelNode Việc hủy nút có địa DelNode xảy ba trường hợp sau: c1) DelNode nút lá: Trong trường hợp đơn giản cần cắt bỏ mối quan hệ cha-con PrDelNode DelNode cách cho trỏ PrDelNode->BST_Left (nếu DelNode nút bên trái PrDelNode) cho trỏ PrDelNode->BST_Right (nếu DelNode nút bên phải PrDelNode) trỏ NULL tiến hành hủy (delete) nút có địa DelNode Ví dụ: Giả sử cần hủy nút có Key = 30 (DelData = 30) BSTree 60 25 19 10 NULL DelNode NULL NULL PrDelNode 40 65 NULL 30 NULL NULL 44 NULL NULL NULL Trong trường hợp cho PrDelNode->BST_Left = NULL: BSTree 60 25 19 10 PrDelNode DelNode NULL 40 65 NULL NULL NULL 44 30 NULL NULL NULL NULL NULL NULL Trang: 174 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 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 to lic Kết sau huûy: BSTree 60 PrDelNode 19 10 NULL 40 NULL 65 NULL NULL NULL 44 NULL NULL NULL c2) DelNode nút có 01 nút gốc con: Trong trường hợp đơn giản cần chuyển mối quan hệ chacon PrDelNode DelNode thành mối quan hệ cha-con PrDelNode nút gốc DelNode tiến hành cắt bỏ mối quan hệ cha-con DelNode 01 nút gốc tiến hành hủy nút có địa DelNode Ví dụ: Giả sử cần hủy nút coù Key = 19 (DelData = 19) BSTree PrDelNode DelNode 60 25 65 19 10 NULL 40 NULL NULL NULL NULL 30 NULL 44 NULL NULL NULL Trang: 175 d o m o c 25 C w o c u -tr a c k w k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật 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 c u -tr a c k O W N y bu k lic Trong trường hợp thực bước: B1: PrDelNode->BST_Left = DelNode->BST_Left B2: DelNode->BST_Left = NULL BSTree DelNode 60 25 65 19 10 NULL NULL 40 NULL NULL NULL 30 NULL NULL 44 NULL NULL NULL Kết sau huûy: BSTree PrDelNode 60 25 65 10 NULL 40 NULL NULL NULL 30 NULL 44 NULL NULL NULL c3) DelNode nút có đủ 02 nút gốc con: Trường hợp phức tạp, việc hủy tiến hành theo hai cách sau (có thể có nhiều cách khác song trình bày hai cách): - Chuyển 02 DelNode thành con: Theo phương pháp chuyển phải DelNode (DelNode BST_Right) thành phải có nút gốc nút phải trái DelNode (phải DelNode->BST_Left), chuyển trái DelNode (DelNode->BST_Left) thành trái có nút gốc nút trái phải DelNode (trái Trang: 176 d o m o c PrDelNode 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 w N y bu to c DelNode->BST_Right) Sau chuyển DelNode trở thành nút nút có 01 hủy DelNode trường hợp c1) c2) Ví dụ: Giả sử cần hủy nút có Key = 25 (DelData = 25) Chúng ta chuyển phải DelNode (DelNode->BST_Right) thành phải có nút gốc nút phải trái DelNode (nút MRNode) PrDelNode DelNode MRNode BSTree 60 25 65 19 10 NULL 40 NULL NULL NULL 30 NULL NULL 44 NULL NULL NULL Trong trường hợp thực bước: B1: MRNode->BST_Right = DelNode->BST_Right B2: DelNode->BST_Right = NULL PrDelNode DelNode MRNode 25 65 NULL 10 NULL BSTree 60 19 40 NULL 30 NULL NULL NULL 44 NULL NULL NULL Trang: 177 w 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 c u -tr a c k O W N y bu k lic Tiến hành bước để hủy DelNode: B3: PrDelNode->BST_Left = DelNode->BST_Left B4: DelNode->BST_Left = NULL DelNode MRNode 19 60 25 NULL 65 NULL 10 NULL BSTree 40 NULL 30 NULL NULL NULL 44 NULL NULL NULL Kết sau hủy: PrDelNode MRNode BSTree 60 19 65 10 NULL 40 NULL NULL NULL 30 NULL 44 NULL NULL NULL - Sử dụng phần tử mạng (standby): Theo phương pháp không hủy nút có địa DelNode mà hủy nút có địa phần tử mạng nút phải trái DelNode (MRNode), nút trái phải DelNode (MLNode) Sau chuyển toàn nội dung liệu nút mạng cho DelNode (DelNode Key = MRNode->Key DelNode->Key = MLNode->Key) hủy nút mạng trường hợp c1) c2) Ví dụ: Giả sử cần hủy nút có Key = 25 (DelData = 25) Chúng ta chọn phần tử mạng MLNode nút trái phải DelNode (trái DelNode->BST_Right) để hủy, Trang: 178 d o m o c PrDelNode 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 to lic BSTree DelNode 60 25 19 10 NULL PrMLNode MLNode NULL NULL 40 65 NULL 30 NULL NULL 44 NULL NULL NULL Chuyển liệu MLNode veà cho DelNode: DelNode->Key = MLNode->Key BSTree DelNode 60 30 19 10 NULL PrMLNode MLNode NULL NULL 40 65 NULL 30 NULL NULL 44 NULL NULL NULL Tiến hành hủy MLNode (hủy nút lá): PrMLNode->BST_Left = NULL BSTree DelNode 60 30 19 10 NULL MLNode NULL 30 NULL NULL PrMLNode 40 65 NULL NULL NULL NULL 44 NULL NULL Trang: 179 d o m o c C w o c u -tr a c k w k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật 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 w N y bu to c BSTree 60 30 19 10 NULL 40 NULL NULL PrMLNode 65 NULL NULL NULL 44 NULL NULL - Thuật toán hủy nút nhị phân tìm kiếm phương pháp chuyển phải nút cần hủy thành phải có nút gốc nút phải trái nút cần hủy (nếu nút cần hủy có đủ 02 con): // Tìm nút cần hủy nút cha nút cần hủy B1: DelNode = BSTree B2: PrDelNode = NULL B3: IF (DelNode = NULL) Thực Bkt B4: IF (DelNode->Key = DelData) Thực B8 B5: IF (DelNode->Key > DelData) // Chuyển sang trái B5.1: PrDelNode = DelNode B5.2: DelNode = DelNode->BST_Left B5.3: OnTheLeft = True B5.4: Thực B7 B6: IF (DelNode->Key < DelData) // Chuyển sang phaûi B6.1: PrDelNode = DelNode B6.2: DelNode = DelNode->BST_Right B6.3: OnTheLeft = False B6.4: Thực B7 B7: Lặp lại B3 // Chuyển mối quan hệ DelNode cho nút khác B8: IF (PrDelNode = NULL) // DelNode nút gốc // Nếu DelNode nút B8.1: If (DelNode->BST_Left = NULL) and (DelNode->BST_Right = NULL) B8.1.1: BSTree = NULL B8.1.2: Thực B10 // Nếu DelNode có phải B8.2: If (DelNode->BST_Left = NULL) and (DelNode->BST_Right != NULL) B8.2.1: BSTree = BSTree->BST_Right Trang: 180 d o m w Kết sau hủy: DelNode 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 // Nếu DelNode có trái B8.3: If (DelNode->BST_Left != NULL) and (DelNode->BST_Right = NULL) B8.3.1: BSTree = BSTree->BST_Left B8.3.2: DelNode->BST_Left = NULL B8.3.3: Thực B10 // Nếu DelNode có hai caây B8.4: If (DelNode->BST_Left != NULL) and (DelNode->BST_Right != NULL) // Tìm nút phải trái cuûa DelNode B8.4.1: MRNode = DelNode->BST_Left B8.4.2: if (MRNode->BST_Right = NULL) Thực B8.4.5 B8.4.3: MRNode = MRNode->BST_Right B8.4.4: Lặp lại B8.4.2 // Chuyển phải DelNode phải MRNode B8.4.5: MRNode->BST_Right = DelNode->BST_Right B8.4.6: DelNode->BST_Right = NULL // Chuyển trái lại DelNode cho BSTree B8.4.7: BSTree = BSTree->BST_Left B8.4.8: DelNode->BST_Left = NULL B8.4.9: Thực B10 B9: ELSE // DelNode nút gốc // Nếu DelNode nút B9.1: If (DelNode->BST_Left = NULL) and (DelNode->BST_Right = NULL) // DelNode trái PrDelNode B9.1.1: if (OnTheLeft = True) PrDelNode->BST_Left = NULL B9.1.2: else // DelNode phải PrDelNode PrDelNode->BST_Right = NULL B9.1.3: Thực B10 // Nếu DelNode có phaûi B9.2: If (DelNode->BST_Left = NULL) and (DelNode->BST_Right != NULL) B9.2.1: if (OnTheLeft = True) PrDelNode->BST_Left = DelNode->BST_Right B9.2.2: else PrDelNode->BST_Right = DelNode->BST_Right B9.2.3: DelNode->BST_Right = NULL B9.2.4: Thực B10 // Nếu DelNode có trái B9.3: If (DelNode->BST_Left != NULL) and (DelNode->BST_Right = NULL) B9.3.1: if (OnTheLeft = True) PrDelNode->BST_Left = DelNode->BST_Left Trang: 181 d o m w B8.2.2: DelNode->BST_Right = NULL B8.2.3: Thực B10 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 w N y bu to c w B9.3.2: else PrDelNode->BST_Right = DelNode->BST_Left B9.3.3: DelNode->BST_Left = NULL B9.3.4: Thực B10 // Nếu DelNode có hai B9.4: If (DelNode->BST_Left != NULL) and (DelNode->BST_Right != NULL) // Tìm nút phải trái DelNode B9.4.1: MRNode = DelNode->BST_Left B9.4.2: if (MRNode->BST_Right = NULL) Thực B9.4.5 B9.4.3: MRNode = MRNode->BST_Right B9.4.4: Lặp lại B9.4.2 // Chuyển phải DelNode thành phaûi MRNode B9.4.5: MRNode->BST_Right = DelNode->BST_Right B9.4.6: DelNode->BST_Right = NULL // Chuyển trái lại DelNode veà cho PrDelNode B9.4.7: if (OnTheLeft = True) PrDelNode->BST_Left = DelNode->BST_Left B9.4.8: else PrDelNode->BST_Right = DelNode->BST_Left B9.4.9: DelNode->BST_Left = NULL B9.4.10: Thực B10 // Hủy DelNode B10: delete DelNode Bkt: Kết thúc - Cài đặt thuật toán: Hàm BST_Delete_Node_TRS có prototype: int BST_Delete_Node_TRS(BST_Type &BS_Tree, T DelData); Hàm thực việc hủy nút có thành phần Key DelData nhị phân tìm kiếm BS_Tree phương pháp chuyển phải nút cần hủy thành phải có nút gốc nút phải trái nút cần hủy (nếu nút cần hủy có hai con) Hàm trả giá trị việc hủy thành công (có nút để hủy), trường hợp ngược lại hàm trả giá trị (không tồn nút có Key DelData rỗng) int BST_Delete_Node_TRS(BST_Type &BS_Tree, T DelData) { BST_Type DelNode = BS_Tree; BST_Type PrDelNode = NULL; int OnTheLeft = 0; while (DelNode != NULL) { if (DelNode->Key == DelData) break; PrDelNode = DelNode; if (DelNode->Key > DelData) Trang: 182 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 ... Kết thúc - Cài đặt thuật toán: Hàm BST_Delete_Node_TRS có prototype: int BST_Delete_Node_TRS(BST_Type &BS_Tree, T DelData); Hàm thực việc hủy nút có thành phần Key DelData nhị phân tìm kiếm BS_Tree... NULL NULL NULL 44 NULL NULL - Thuật toán hủy nút nhị phân tìm kiếm phương pháp chuyển phải nút cần hủy thành phải có nút gốc nút phải trái nút cần hủy (nếu nút cần hủy có đủ 02 con): // Tìm nút cần... hủy thành phải có nút gốc nút phải trái nút cần hủy (nếu nút cần hủy có hai con) Hàm trả giá trị việc hủy thành công (có nút để hủy), trường hợp ngược lại hàm trả giá trị (không tồn nút có Key

Ngày đăng: 08/05/2021, 17:24

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan