Giáo trình Cấu trúc dữ liệu và giải thuật được biên soạn gồm có 6 chương với những nội dung chính sau: Chương I: Tổng quan về cấu trúc dữ liệu và giải thuật; Chương II: Đệ quy và giải thuật đệ quy; Chương III: Tìm kiếm; Chương IV: Các phương pháp sắp xếp cơ bản; Chương V: Danh sách; Chương VI: Cây nhị phân. Mời các bạn cùng tham khảo để biết thêm nội dung chi tiết.
TẬP ĐOÀN DỆT MAY VIỆT NAM TRƢỜNG CAO ĐẲNG KINH TẾ - KỸ THUẬT VINATEX TP.HCM Giáo Trình CẤU TRÚC DỮ LIỆU GIẢI THUẬT Nghề: Công nghệ thông tin Trình độ: Cao Đẳng (Ban hành theo Quyết định số: ngày tháng năm trường Cao đẳng Kinh tế - Kỹ thuật Vinatex Tp.HCM) TP.HỒ CHÍ MINH, THÁNG 03 NĂM 2019 Tuyên bố quyền Giáo trình sử dụng làm tài liệu giảng dạy lƣu hành nội trƣờng Cao đẳng Kinh tế - Kỹ thuật Vinatex Tp.HCM Cao đẳng Kinh tế - Kỹ thuật Vinatex Tp.HCM không sử dụng không cho phép cá nhân hay tổ chức sử dụng giáo trình với mục đích kinh doanh Mọi trích dẫn, sử dụng giáo trình với mục đích khác hay nơi khác phải đƣợc đồng ý văn Cao đẳng Kinh tế - Kỹ thuật Vinatex Tp.HCM LỜI NÓI ĐẦU Tài liệu dùng cho học sinh hệ Trung cấp sinh viên hệ Cao đẳng ngành công nghệ thông tin học tập nghiêm cứu “Cấu trúc liệu giải thuật” Tài liệu gồm nội dung chisng sau: Chƣơng 1: Tổng quan cấu trúc liệu giải thuật, tiêu chuẩn danh gia cấu trúc liệu ,phản ánh thực tếp, phù hợp với thao tác đó, tiết kiệm tài nguyên hệ thống Kiểu liệu, kiểu liệu bản, kiểu liệu có cấu trúc, kiểu chuỗi ký tự, kiểu mảng, kiểu union, kiểu mẫu tin (cấu trúc), kiểu trỏ, kiểu tập tin, mối quan hệ cấu trúc liệu giải thuật Chƣơng 2: ệ quy giải thuật đệ quy, khái niệm đệ quy, thuật toán đệ quy chƣơng trình đệ quy, giải thuật đệ quy, chƣơng trình đệ quy Các toán đệ quy bản, hàm tính giai thừa, dãy số fibonacci Chƣơng 3: Tìm kiếm, tìm kiếm tuyến tính,tìm kiếm nhị phân, giải thuật, cài đặt, đánh giá giải Chƣơng 4: Các phƣơng pháp xếp bản, định nghĩa toán xếp, phƣơng pháp chọn (Selection Sort), chèn (Insertion Sort), đổi chỗ (Interchange Sort), bọt (Bubble Sort), xếp nhanh Quick Sort, giải thuật phân hoạch dãy al, al+1, , ar thành dãy con, giải thuật phân hoạch dãy xếp dãy al, al+1, , ar, cài đánh giá giải thuật Chƣơng 5: Danh sách, danh sách liên kết (Xâu liên kết), định nghiã, biểu diễn Xâu liên kết, danh sách liên kết đơn (Xâu đơn), khai báo xâu liên kết đơn, thao tác xâu liên kết đơn, loại bỏ phần tủ xâu, duyệt xâu, thứ tự Xâu, thuật Toán QuickSort, ngăn xếp – stack,cài đặt ngăn xếp xâu đơn, cài đặt ngăn xếp mảng thao tác, ứng dụng ngăn xếp xử lý biểu thức hậu tố Hàng đợi – Queue, khái niệm, cài đặt hàng đợi xâu liên kết, cài đặt hàng đợi mảng Chƣơng 6: Cây nhị phân, định nghĩa khái niệm bản, định nghĩa cây, khái niệm khác, nhị phân, định nghĩa, vài tính chất nhị phân, biểu diễn nhị phân, duyệt nhị phân, định nghĩa, thuật toán duyệt nhị phân, cài đặt thuật toán duyệt qua nhị phân LNR, cài đặt nhị phân Cây tìm kiếm nhị phân (Binary Search Trees), định nghĩa, cài đặt tìm kiếm nhị phân, tìm kiếm phần tử BST, chèn phần tử vào BST, xây dựng BST, phƣơng pháp xếp BST, xóa phần tử khỏi BST, hủy nhị phân Tài liệu không đề cập đến vấn đề sở lý luận mà cịn trình bày số kỹ năng, kinh nghiệm cần thiết để thiết kế cài đặt mạng máy tính Hy vọng có ích cho bạn học sinh sinh viên ngƣời muốn xây dựng hệ thống tin học ứng dụng phục vụ cho sản xuất, quản lý doanh nghiệp Có thể cịn nhiều thiếu sót trình bày biên soạn khả năng, trình độ, nhƣng ngƣời biên soạn mạnh dạn giới thiệu tài liệu mong nhận đƣợc góp ý bạn đọc CHƢƠNG TRÌNH MƠN HỌC I Vị trí, tính chất mơn học: II Mục tiêu môn học: III Nội dung môn học: Chương 1: TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT I CÁC TIÊU CHUẨN DANH GIA CẤU TRÚC DỮ LIỆU Phản ánh thực tế : Phù hợp với thao tác đó: Tiết kiệm tài nguyên hệ thống: II KIỂU DỮ LIỆU III KIỂU DỮ LIỆU CƠ BẢN 10 IV CÁC KIỂU DỮ LIỆU CÓ CẤU TRÚC 11 Kiểu chuỗi ký tự 11 Kiểu mảng 12 Kiểu union 13 Kiểu mẫu tin (cấu trúc) 14 Kiểu trỏ 18 Kiểu tập tin 32 Mối quan hệ cấu trúc liệu giải thuật 42 Chương 2: Ệ QUY V GIẢI THUẬT Ệ QUY 44 I KHAI NIỆM DỆ QUI 44 II THUẬT TOÁN Ệ QUI 44 III HIỆU LỰC CỦA Ệ QUI 46 Ƣu nhƣợc điểm 47 Phân loại 48 III CÁC B I TOÁN Ệ QUY CĂN BẢN 51 Hàm tính giai thừa 51 Dãy số Fibonacci 52 Chương 3: TÌM I M 53 I TIM KI M TUY N TINH 53 Giải thuật 53 Cài đặt 54 Ðánh giá giải thuật 55 II TÌM KI M NHỊ PHÂN 55 Giải thuật 55 Cài đặt 56 Ðánh giá giải thuật 57 Chương 4: CÁC PHƢƠNG PHÁP SẮP X P CƠ BẢN 58 I PHƢƠNG PHÁP CHỌN TRỰC TI P (SELECTION SORT) 58 Giải thuật 58 Ví dụ 58 Cài đặt 59 Ðánh giá giải thuật 60 II PHƢƠNG PHÁP CHÈN TRỰC TI P (INSERTION SORT) 60 Giải thuật 60 Ví dụ 61 Cài đặt 62 ánh giá giải thuật 63 III PHƢƠNG PHÁP ỔI CHỖ TRỰC TI P (INTERCHANGE SORT) 63 Giải thuật 63 Ví dụ : 64 Cài đặt 67 Ðánh giá giải thuật 67 IV PHƢƠNG PHÁP NỔI BỌT (BUBBLE SORT) 68 Giải thuật 68 Ví dụ 68 Cài đặt 71 Ðánh giá giải thuật 71 Nhận xét 71 V PHƢƠNG PHÁP QUIC SORT 71 Giải thuật phân hoạch dãy al, al+1, , ar thành dãy con: 72 Giải thuật phân hoạch dãy xếp dãy al, al+1, , ar: 72 Cài đặt 74 Ðánh giá giải thuật 75 Chương 5: DANH SÁCH 76 I DANH SÁCH LIÊN K T (XÂU LIÊN K T ) 76 ịnh nghiã: 76 Biểu diễn Xâu liên kết: 76 II DANH SÁCH LIÊN K T ƠN (XÂU ƠN) 77 Khai báo xâu liên kết đơn: 77 Các thao tác xâu liên kết đơn: 78 Loại bỏ phần tử xâu: 83 Duyệt xâu: 87 Sắp thứ tự Xâu: 87 Thuật Toán QuickSort: 88 III NGĂN X P - STACK 89 ịnh nghiã 89 Cài đặt ngăn xếp xâu đơn 89 Cài đặt ngăn xếp mảng thao tác: 92 Ứng dụng ngăn xếp xử lý biểu thức hậu tố: 93 IV H NG ỢI - QUEUE 96 Khái niệm 96 Cài đặt hàng đợi xâu liên kết: 96 Cài đặt hàng đợi mảng: 97 Chương 6: CÂY NHỊ PHÂN 101 I ỊNH NGHĨA V CÁC HÁI NIỆM CƠ BẢN 101 ịnh nghĩa 101 II CÂY NHỊ PHÂN 103 ịnh nghĩa: 103 Vài tính chất nhị phân 103 Biểu diễn nhị phân 103 III DUYỆT CÂY NHỊ PHÂN 105 ịnh nghĩa: 105 Các thuật toán duyệt nhị phân 105 Cài đặt thuật toán duyệt qua nhị phân LNR 106 Cài đặt nhị phân 108 IV CÂY TÌM KI M NHỊ PHÂN (BINARY SEARCH TREES) 110 ịnh nghĩa 110 Cài đặt tìm kiếm nhị phân 111 Tìm kiếm phần tử BST 112 Chèn phần tử vào BST, xây dựng BST 113 Phƣơng pháp xếp BST 115 Xóa phần tử khỏi BST, hủy nhị phân 116 CHƢƠNG TRÌNH MƠN HỌC Tên mơn học: Cấu trúc liệu giải thuật Mã môn học: MH 12 Thời gian thực môn học: 75 giờ; (Lý thuyết: 15 giờ; Thực hành, thí nghiệm, thảo luận, tập: 55 giờ; Kiểm tra: giờ) I Vị trí, tính chất mơn học: - Vị trí: mơn học đƣợc bố trí sau ngƣời học học xong mơn học: Lập trình bản, Cơ sở liệu - Tính chất: môn học sở ngành bắt buộc II Mục tiêu môn học: - Về kiến thức: Hiểu đƣợc mối quan hệ cấu trúc liệu giải thuật Phân tích đƣợc kiểu liệu, giải thuật, kết hợp chúng để tạo thành chƣơng trình máy tính Biết cách tổ chức liệu hợp lý, khoa học cho chƣơng trình đơn giản Biết áp dụng thuật toán hợp lý cấu trúc liệu tƣơng thích để giải toán thực tế Biết áp dụng đƣợc phƣơng pháp xếp, tìm kiếm đơn giản - Về kỹ năng: ánh giá kỹ thực hành ngƣời học: Dùng ngơn ngữ lập trình thể máy tính toán cần kiểm nghiệm về: đệ qui, danh sách, cây, đồ thị, xếp, tìm kiếm - Về lực tự chủ trách nhiệm: Rèn luyện tƣ logic để phân tích, tổng hợp Thao tác cẩn thận, tỉ mỉ III Nội dung môn học: Chương 1: TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Mục tiêu: - Mô tả đƣợc khái niệm giải thuật, mối quan hệ cấu trúc liệu giải thuật, đánh giá đƣợc độ phức tạp giải thuật - Ghi nhớ đƣợc kiểu liệu bản, kiểu liệu trừu tƣợng cấu trúc liệu Nội dung chƣơng: I CÁC TIÊU CHUẨN DANH GIA CẤU TRÚC DỮ LIỆU Phản ánh thực tế : ây tiêu chuẩn quan trọng nhất, định tính đắn tồn toán Cần xem xét kỹ lƣỡng nhƣ dự trù trạng thái biến đổi liệu chu trình sống để chọn cấu trúc liệu lƣu trữ thể xác đối tƣợng thực tế Ví dụ: Một số tình chọn cấu trúc lƣu trữ sai : - Chọn biến số nguyên int để lƣu trữ tiền thƣởng bán hàng (đƣợc tính theo cơng thức tiền thƣởng bán hàng = trị giá hàng * 5%), làm tròn giá trị tiền thƣởng gây thiệt hại cho nhân viên bán hàng Trƣờng hợp phải sử dụng biến số thực để phản ánh kết công thức tính thực tế - Trong trƣờng trung học, lớp nhận tối đa 28 học sinh Lớp có 20 học sinh, tháng học sinh đóng học phí $10 Chọn biến số nguyên unsigned char ( khả lƣu trữ - 255) để lƣu trữ tổng học phí lớp học tháng, xảy trƣờng hợp có thêm học sinh đƣợc nhận vào lớp giá trị tổng học phí thu đƣợc $260, vƣợt khỏi khả lƣu trữ biến chọn, gây tình trạng tràn, sai lệch Phù hợp với thao tác đó: Tiêu chuẩn giúp tăng tính hiệu đề án: việc phát triển thuật toán đơn giản, tự nhiên hơn; chƣơng trình đạt hiệu cao tốc độ xử lý Ví dụ: Một tình chọn cấu trúc lƣu trữ không phù hợp: Cần xây dựng chƣơng trình soạn thảo văn bản, thao tác xử lý thƣờng xảy chèn, xoá sửa ký tự văn Trong thời gian xử lý văn bản, chọn cấu trúc lƣu trữ văn trực tiếp lên tập tin gây khó khăn xây dựng giải thuật cập nhật văn làm chậm tốc độ xử lý chƣơng trình phải làm việc nhớ Trƣờng hợp nên tìm cấu trúc liệu tổ chức nhớ để lƣu trữ văn suốt thời gian soạn thảo Lưu ý: ối với ứng dụng , cần ý đến thao tác đƣợc sử dụng nhiều để lựa chọn cấu trúc liệu cho thích hợp Tiết kiệm tài nguyên hệ thống: Cấu trúc liệu nên sử dụng tài nguyên hệ thống vừa đủ để đảm nhiệm đƣợc chức Thơng thƣờng có loại tài nguyên cần lƣu tâm : CPU nhớ.Tiêu chuẩn nên cân nhắc tùy vào tình cụ thể thực đề án Nếu tổ chức sử dụng đề án cần có xử lý nhanh chọn cấu trúc liệu yếu tố tiết kiệm thời gian xử lý phải đặt nặng tiêu chuẩn sử dụng tối ƣu nhớ, ngƣợc lại Ví dụ: Một số tình chọn cấu trúc lƣu trữ lãng phí: - Sử dụng biến int (2 bytes) để lƣu trữ giá trị cho biết tháng hành Biết tháng nhận giá trị từ 1-12, nên cần sử dụng kiểu char (1 byte) đủ - ể lƣu trữ danh sách học viên lớp, sử dụng mảng 50 phần tử (giới hạn số học viên lớp tối đa 50) Nếu số lƣợng học viên thật 50, gây lãng phí Trƣờng hợp cần có cấu trúc liệu linh động mảng- ví dụ xâu liên kết đƣợc đề cập chƣơng sau II KIỂU DỮ LIỆU iểu liệu T đƣợc xác định < V, O > , với : V (Value): tập giá trị hợp lệ mà đối tƣợng kiểu T lƣu trữ O (Operation): tập thao tác xử lý thi hành đối tƣợng kiểu T Ví du: Giả sử có kiểu liệu mẫu tự = < Vc , Oc > với Vc = { a-z,A-Z} Oc = { lấy mã ASCII ký tự, biến đổi ký tự thƣờng thành ký tự hoa…} Giả sử có kiểu liệu số nguyên = < Vi, Oi > với Vi = { -32768 32767} Oi = { +, -, *, /, %} Nhƣ vậy, muốn sử dụng kiểu liệu cần nắm vững nội dung liệu đƣợc phép lƣu trữ xử lý tác động Các thuộc tính DL bao gồm: Tên KDL Miền giá trị ích thƣớc lƣu trữ Tập toán tử tác động lên DL III KIỂU DỮ LIỆU CƠ BẢN Các loại liệu thƣờng loại liệu đơn giản, khơng có cấu trúc nhƣ số ngun, số thực, ký tự, giá trị logic Các loại liệu này, tính thơng dụng đơn giản mình, thƣờng đƣợc ngơn ngữ lập trình (NNLT) cấp cao xây dựng sẵn nhƣ thành phần ngôn ngữ để giảm nhẹ cơng việc cho ngƣời lập trình Chính đơi ngƣời ta cịn gọi chúng kiểu liệu định sẵn Thông thƣờng, kiểu liệu bao gồm : Kiểu có thứ tự rời rạc: số nguyên, ký tự, logic, liệt kê, miền … Kiểu không rời rạc: số thực Tùy ngơn ngữ lập trình, kiểu liệu định nghĩa sẵn khác đơi chút Với ngơn ngữ C, kiểu liệu gồm số nguyên, số thực, ký tự Và theo quan điểm C, kiểu ký tự thực chất kiểu số nguyên mặt lƣu trữ, khác cách sử dụng Ngoài ra, giá trị logic ÚNG (TRUE) giá trị logic SAI (FALSE) đƣợc biểu diễn C nhƣ giá trị nguyên khác zero zero Các kiểu liệu định sẵn C gồm kiểu sau: Tên kiểu Kích thƣớc Miền giá trị Char 01 byte -128 đến 127 Có thể dùng nhƣ số nguyên byte có dấu kiểu ký tự Unsign char 01 byte đến 255 Số nguyên byte không dấu Int 02 byte -32738 đến 32767 Số nguyên byte Unsign int 02 byte đến 65535 Có thể gọi tắt unsign Long 04 byte -232 đến 231 -1 Unsign long 04 byte Float 04 byte Ghi đến 232-1 3.4E-38 đến 3.4E38 Giới hạn trị tuyệt đối.Các giá trị < 3.4E-38 đƣợc coi = Tuy nhiên kiểu float có chữ số có nghĩa III DUYỆT CÂY NHỊ PHÂN Định nghĩa: Duyệt qua nhị phân quét qua nút nhị phân cho nút x lý lần Dựa vào định nghĩa đệ qui ta chia nhị phân làm phần: gốc, bên trái, bên phải Ta có phương pháp d yệt nhị phân tùy theo trình tự duyệt phần trên: + Duyệt qua theo thứ tự (LNR) + Duyệt qua theo thứ tự đầu (NLR) + Duyệt qua theo thứ tự cuối (LRN) đó: L : quét trái nút R : quét phải nút N : xử lý nút Các thuật toán duyệt nhị phân * Thuật toán duyệt qua theo thứ tự (LNR: Trái - Gốc - Phải) : + Duyệt qua trái theo thứ tự giữa; + Duyệt qua gốc; + Duyệt qua phải theo thứ tự * Thuật toán duyệt qua theo thứ tự đầu (NLR: Gốc - Trái - Phải): + Duyệt qua gốc; + Duyệt qua trái theo thứ tự đầu; + Duyệt qua phải thứ tự đầu Thuật toán NLR duyệt theo chiều sâu * Thuật toán duyệt qua theo thứ tự cuối (LRN: Trái - Phải - Gốc): + Duyệt qua trái theo thứ tự cuối; + Duyệt qua phải theo thứ tự cuối; + Duyệt qua gốc * Ví dụ: Biểu diễn biểu thức: A - B * C + D lên nhị phân: Duyệt theo thứ tự khác nhau: LNR: A - B * C + D ( biểu thức trung tố ) NLR: + - A * B C D ( biểu thức tiền tố ) LRN: A B C * - D + ( biểu thức hậu tố ) Với cách biểu diễn biểu thức số học dƣới dạng nhị phân, dựa cách duyệt LRN ta tính giá trị biểu thức (Bài tập) Do định nghĩa đệ quy nhị phân, thuật tốn duyệt qua theo kiểu đệ quy thích hợp Cài đặt thuật toán duyệt qua nhị phân LNR a/ Cài đặt thuật toán LNR dư i dạng đệ qui : /* Input: - Root : trỏ đến nút gốc nhị phân Output: - Duyệt qua xử lý nút nhị phân theo thứ tự LNR */ void LNRĐệQuy (TreePointer Root) { if (Root != NULL) { LNR ệQuy (Root->LChild); Xử lý (Root); //X lý theo yêu cầu cụ thể, chẳng hạn: Xuất(Root->Data); LNR ệQuy (Root->RChild) ; } return; } Thuật toán duyệt nhị phân theo thứ tự (LNR) viết lại dƣới dạng lặp, cách sử dụng stack để lư lại địa nút gốc trư c đến trái Trƣớc hết, ta khai báo cấu trúc nút stack trên: typedef struct NS { TreePointer Data; struct NS * Next; } NodeStack; typedef NodeStack * StackType; b/ Cài đặt thuật toán LNR dư i dạng lặp : /* Input: - Root : trỏ đến nút gốc nhị phân Output: - Duyệt qua xử lý nút nhị phân theo thứ tự LNR */ void LNRLap(TreePointer Root) { TreePointer p; int TiepTuc = 1; StackType S; p = Root; S = CreateEmptyStack(); // Khởi tạo ngăn xếp rỗng { while (p != NULL) { Push(S,p); // ẩy p vào stack S p = p->LChild; } if (!EmptyStack(S)) // Nếu stack S khác rỗng { Pop(S,p); // Lấy phần tử p đỉnh stack S XuLy(p); p = p->RChild; } else TiepTuc = 0; } while (TiepTuc); return ; } Với hai trƣờng hợp duyệt lại (NLR LRN), ta cài đặt chúng dƣới dạng đệ quy lặp (bài tập) Một cách tổng quát, ta viết lại ba thuật toán duyệt dƣới dạng lặp (bài tập) Cài đặt nhị phân Tƣơng tự tổng quát, ta cài đặt nhị phân trỏ cách thiết kế nút có hai trỏ, trỏ trỏ nút trái, trỏ trỏ nút phải, trƣờng Data chứa nhãn nút typedef … TData; typedef struct Tnode { TData Data; TNode* left,right; }; typedef TNode* TTree; Với cách khai báo nhƣ ta thiết kế phép toán nhị phân nhƣ sau : Tạo rỗng Cây rỗng không chứa nút Nhƣ tạo rỗng ta cần cho trỏ tới giá trị NULL void MakeNullTree(TTree *T) 12 { (*T)=NULL; } Kiểm tra rỗng int EmptyTree(TTree T) { return T==NULL; } Xác định trái nút TTree LeftChild(TTree n) { if (n!=NULL) return n->left; else return NULL; } Xác định phải nút TTree RightChild(TTree n) { if (n!=NULL) return n->right; else return NULL; } Kiểm tra nút lá: Nếu nút nút khơng có nên trái phải NULL int IsLeaf(TTree n) { if(n!=NULL) return(LeftChild(n)==NULL)&&(RightChild(n)==NULL); else return NULL; } Xác định số nút int nb_nodes(TTree T) { 13 if(EmptyTree(T)) return 0; else return 1+nb_nodes(LeftChild(T))+ nb_nodes(RightChild(T)); } Các thủ tục duyệt cây: tiền tự, trung tự, hậu tự Thủ tục duyệt tiền tự void PreOrder(TTree T) { coutData) return TìmBSTĐệQuy (Root>RChild,Item); else return TìmBSTĐệQuy (Root->LChild,Item); } else return(NULL); } * Thủ tục đƣợc viết dƣới dạng đệ qui thích hợp với lối tư d y tự nhiên giải thuật định nghĩa đệ qui nhị phân Song trƣờng hợp thủ tục viết dƣới dạng lặp lại t hiệu Thuật toán tìm kiếm dạng lặp: /* Input: - Root: trỏ đến nút gốc BST - Item: giá trị khóa phần tử cần tìm Output: - Trả trỏ LocPtr đến nút BST chứa Item trỏ Parent đến nút cha nút chứa Item tìm thấy Item BST - Trả trị NULL ngƣợc lại */ TreePointer TìmBSTLặp(TreePointer Root, ElementType Item, TreePointer &Parent) { TreePointer LocPtr = Root; Parent = NULL; while (LocPtr != NULL) if (Item==LocPtr->Data) return (LocPtr); Cấu trúc IV.11 else {Parent = LocPtr; if (Item > LocPtr->Data) LocPtr = LocPtr->RChild; else LocPtr = LocPtr->LChild; } return(NULL); } Với cấu trúc cây, việc tìm kiếm theo khóa nhanh nhiều so với cấu trúc danh sách liên kết Chi phí tìm kiếm (độ phức tạp) trung bình nhị phân có n nút khoảng log2 n Chèn phần tử vào BST, xây dựng BST Việc chèn thêm phần tử Item vào BST cần phải thỏa ràng buộc định nghĩa BST Trƣớc chèn Item, ta cần tìm khóa Item có BST hay khơng, có khỏi chèn (do BST ta chứa phần tử có khóa khác nhau); ngƣợc lại, chấm dứt thao tác tìm kiếm ta iết vị trí chèn (ở nút lá) * Ví dụ: Giả sử ta có BST (với nút có khóa khác nhau): Ta cần thêm phần tử „R‟: Yêu cầu “vào – ra” thao tác chèn: /* Input: - Root: trỏ đến nút gốc BST - Item: giá trị liệu nút cần chèn Output: - Trả trị trỏ Root đến nút gốc BST chèn đƣợc - Trả trị -1 Item có - Trả trị gặp lỗi cấp phát nhớ cho nút */ Thao tác chèn nút Item vào BST (dạng lặp): int ChènBSTLặp(TreePointer &Root, ElementType Item) { TreePointer LocPtr, Parent; if (TìmBSTLặp(Root, Item, Parent)) { cout RChild = NULL; if (Parent == NULL) Root = LocPtr; // rỗng else if (Item < Parent->Data) Parent->LChild = LocPtr; else Parent->RChild = LocPtr; return 1; } } Thủ tục chèn nút Item vào BST (dạng đệ qui): int ChènBSTĐệQui(TreePointer &Root, ElementType Item) { TreePointer LocPtr; if (Root == (TreePointer) NULL) // chèn nút vào rỗng { if ((Root = CấpPhát ()) == NULL) return 0; Root ->Data = Item; Root ->LChild = NULL; Root ->RChild = NULL; } else if (Item < Root->Data) ChènBSTĐệQui (Root->LChild,Item); else if (Item > Root->Data) ChènBSTĐệQui(Root->RChild,Item); else { cout LChild; if (SubTree == NULL ) SubTree = x->RChild; //SubTree khác rỗng (nếu có) x if (Parent == NULL) Root = SubTree; // xoá nút gốc else if (Parent->LChild == x) Parent->LChild = SubTree ; else Parent->RChild = SubTree; delete x; Xố nút có hai nút con: Giả sử ta cần xố nút E có nút BST sau : ƣa trƣờng hợp đầu cách sau: Thay trị nút mà x trỏ đến trị nút theo thứ tự (nút nút cực trái xa theo nhánh phải x, nút nhỏ (tất nhiên theo trƣờng khóa) số nút lớn x>Data) Sau xố nút (nút nút có tối đa nút ) * Sau ta xây dựng thủ tục XóaBST để xóa nút Item BST Trong thủ tục có dùng đến thủ tục TìmBSTLặp Thủ tục XốBST tìm nút có khóa Item xố khỏi BST Gọi: - x: trỏ đến nút chứa Item - xSucc: phần tử x theo thứ tự (nếu x có con) - Parent: trỏ đến cha x hay xSucc - SubTree: trỏ đến x /* Input: - Root: trỏ đến nút gốc BST - Item: giá trị liệu nút cần xóa Output: - Trả trị trỏ Root đến nút gốc BST tìm thấy nút chứa Item xố đƣợc - Trả trị ngƣợc lại */ int XóaBST (TreePointer &Root, ElementType Item) { TreePointer x,Parent, xSucc,SubTree; if ((x = TìmBSTLặp(Root,Item,Parent)) ==NULL) return 0;//khơng thấy Item else { if ((x->LChild != NULL) && (x->RChild != NULL)) // nút có { xSucc = x->RChild; Parent = x; while (xSucc->LChild != NULL) { Parent = xSucc; xSucc = xSucc->LChild; } x->Data = xSucc->Data; x = xSucc; } //đã đưa nút có nút có tối đa SubTree = x->LChild; if (SubTree == NULL) SubTree = x->RChild; if (Parent == NULL) Root = SubTree; // xoá nút gốc else if (Parent->LChild == x) Parent->LChild = SubTree; else Parent->RChild = SubTree; delete x; return 1; } } Ta hủy tồn BST cách sử dụng ý tƣởng duyệt theo thứ tự cuối LRN: hủy trái, hủy phải hủy nút gốc void HủyCâyNhịPhân (PointerType &Root) { if (Root) { HủyCâyNhịPhân (Root->LChild); HủyCâyNhịPhân (Root->RChild); delete Root; } return ; } ...Tuyên bố quyền Giáo trình sử dụng làm tài liệu giảng dạy lƣu hành nội trƣờng Cao đẳng Kinh tế - Kỹ thuật Vinatex Tp .HCM Cao đẳng Kinh tế - Kỹ thuật Vinatex Tp .HCM không sử dụng không... Cao đẳng ngành công nghệ thông tin học tập nghiêm cứu ? ?Cấu trúc liệu giải thuật? ?? Tài liệu gồm nội dung chisng sau: Chƣơng 1: Tổng quan cấu trúc liệu giải thuật, tiêu chuẩn danh gia cấu trúc liệu. .. công thức : Cấu trúc liệu + Giải thuật = Chƣơng trình Chương 2: ĐỆ QUY VÀ GIẢI THUẬT ĐỆ QUY Mục tiêu: - Trình bày đƣợc khái niệm đệ quy - Trình bày đƣợc giải thuật chƣơng trình sử dụng giải thuật