Giáo trình Cấu trúc dữ liệu và thuật giải (Nghề Lập trình máy tính) - Tổng cục dạy nghề

210 15 0
Giáo trình Cấu trúc dữ liệu và thuật giải (Nghề Lập trình máy tính) - Tổng cục dạy nghề

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Giáo trình Cấu trúc dữ liệu và thuật giải cung cấp các khái niệm dữ liệu, giải thuật và mối quan hệ mật thiết giữa cấu trúc dữ liệu và giải thuật. Biết phân tích được các loại dữ liệu, giải thuật, sự kết hợp chúng để tạo thành một chương trình máy tính. Biết tổ chức dữ liệu hợp lý, khoa học cho một chương trình từ đơn giản đến phức tạp. Biết áp dụng thuật toán hợp lý nhất đối với cấu trúc dữ liệu tương thích để giải quyết bài toán tối ưu nhất.

BỘ LAO ĐỘNG - THƯƠNG BINH VÀ XÃ HỘI TỔNG CỤC DẠY NGHỀ GIÁO TRÌNH MƠN HỌC: CẤU TRÚC DỮ LIỆU VÀ THUẬT GIẢI Mã số : ITPRG 01 NGHỀ: LẬP TRÌNH MÁY TÍNH Trình độ Cao đẳng nghề NĂM 2012 Tuyên bố quyền : Tài liệu thuộc loại sách giáo trình Cho nên nguồn thơng tin phép dùng ngun trích dùng cho mục đích đào tạo tham khảo Mọi mục đích khác có ý đồ lệch lạc sử dụng với mục đích kinh doanh thiếu lành mạnh bị nghiêm cấm Tổng Cục Dạy nghề làm cách để bảo vệ quyền Tổng Cục Dạy Nghề cám ơn hoan nghênh thơng tin giúp cho việc tu sửa hồn thiện tốt tàI liệu Địa liên hệ: Dự án giáo dục kỹ thuật nghề nghiệp Tiểu Ban Phát triển Chương trình Học liệu ……………………………………………… LỜI TỰA Để đáp ứng nhu cầu học tập người học, tiến hành biên soạn giáo trình, giảng cho mơn học cấu trúc liệu Cuốn sách biên dịch nhờ vào nguồn tài liệu mạng, nguồn tài liệu nước ngoài, đặc biệt dựa sách "Data Structures and Algorithms" Alfred V Aho, John E Hopcroft Jeffrey D Ullman Addison-Wesley tái năm 1987 Đồng thời lồng ghép kinh nghiệm giảng dạy cấu trúc liệu giải thuật Tài liệu biên soạn theo đề cương chi tiết môn học Cấu trúc liệu giải thuật Tổng cục dạy nghề với mã ITPRG01 Mục tiêu nhằm giúp bạn sinh viên chun ngành có tài liệu đọng dùng làm tài liệu học tập, không loại trừ toàn đối tượng khác tham khảo Chúng tơi hi vọng người đọc tìm thấy kiến thức bổ ích tài liệu Mặc dù cố gắng nhiều trình biên soạn giáo trình chắn giáo trình cịn nhiều thiếu sót hạn chế Rất mong nhận đóng góp ý kiến quý báu của người đọc người học để giáo trình ngày hồn thiện MỤC LỤC ĐỀ MỤC TRANG LỜI TỰA MỤC LỤC GIỚI THIỆU VỀ MÔ ĐUN/MÔN HỌC SƠ ĐỒ QUAN HỆ THEO TRÌNH TỰ HỌC NGHỀ CÁC HÌNH THỨC HỌC TẬP CHÍNH TRONG MƠ ĐUN/MƠN HỌC YÊU CẦU VỀ ĐÁNH GIÁ HOÀN THÀNH MÔ ĐUN/MÔN HỌC Bài 1:GIỚI THIỆU CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Bài 2:CÁC KIỄU DỮ LIỆU CÓ CẤU TRÚC ĐƠN GIẢN 28 Bài 3:CẤU TRÚC DỮ LIỆU ĐỘNG – DANH SÁCH 75 10 Bài 4:SẮP XẾP VÀ TÌM KIẾM 138 11 Bài5:CẤU TRÚC DỮ LIỆU ĐỘNG – CÂY 174 12 THUẬT NGỮ CHUYÊN MÔN 228 13 TÀI LIỆU THAM KHẢO 229 GIỚI THIỆU VỀ MÔ ĐUN/MÔN HỌC Vị trí, ý nghĩa, vai trị mơ đun/mơn học Mơn học Lập trình bản, mơn học chứa kiến thức tảng cho việc lập trình có cấu trúc Để phát huy tốt phương pháp lập trình có cấu trúc tiếp tục nghiên cứu mơn học Cấu trúc liệu giải thuật Cấu trúc liệu môn học bổ trợ nhiều cho kiến thức lập trình, kiến thức logic giúp cho nhiều kiến thức để học tốt hai môn học: Thiết kế hướng đối tượng; Lập trình nâng cao Mục tiêu mơ đun/mơn học Hiểu khái niệm liệu, giải thuật mối quan hệ mật thiết cấu trúc liệu giải thuật Biết phân tích loại 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 tổ chức liệu hợp lý, khoa học cho chương trình từ đơn giản đến phức tạp 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 tối ưu Biết áp dụng phương pháp xếp, tìm kiếm từ đơn giản đến phức tạp với mức độ tương đối biết dùng ngơn ngữ lập trình thể máy tính tốn cần kiểm nghiệm Mục tiêu thực mô đun/môn học - Nắm cách thức tổ chức liệu đề giải toán - Nắm giải thuật sở để áp dụng thiết kế thuật toán theo phương pháp top-down phương pháp chia để trị - Phân tích giải thuật mặt thời gian, nhớ, tốc độ chương trình - Tổ chức, thiết kế kiểu liệu có cấu trúc đơn giản, cấu trúc liệu động để giải toán đơn giản vừa - Áp dụng phương pháp toán học (giải thuật) phù hợp cho cấu trúc liệu - Kết hợp với ngơn ngữ lập trình, viết chương trình cấu trúc liệu áp dụng thuật tốn cho tốn cụ thể máy tính Nội dung mơ đun/mơn I GIỚI THIỆU CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT II CÁC KIỂU DỮ LIỆU CÓ CẤU TRÚC ĐƠN GIẢN III CẤU TRÚC DỮ LIỆU ĐỘNG – DANH SÁCH IV SẮP XẾP VÀ TÌM KIẾM V CẤU TRÚC DỮ LIỆU ĐỘNG – CÂY Sơ đồ quan hệ theo trình tự học nghề Hệ thống máy tính Giao diện người máy Lập trình Lập trình nâng cao Lập trình hướng đối tượng Phân tích thiết kế hệ thống Thiết kế hướng đối tượng Mạng Cấu trúc liệu thuật giải Kỹ tin học văn phòng Kỹ Giao tiếp Ứng dụng CNTT doanh nghiệp Cơ sở liệu Công nghệ phần mềm Kỹ Internet & WWW Thiết kế Web Cơ sở toán học Quản lý dự án phần mềm Cơng nghệ Đa phương tiện Lập trình Visual Basic Anh văn cho tin học Lập trình Web Phần cứng máy tính Hệ sở liệu Hướng dẫn đồ án tốt nghiệp An toàn lao động Thi tốt nghiệp CÁC HÌNH THỨC HỌC TẬP CHÍNH TRONG MƠ ĐUN/MƠN HỌC Các hình thức học tập mơn học Học phịng lý thuyết - Trình bày đầy đủ cấu trúc mơ hình, trường hợp áp dụng - Nhiệm vụ phải phân tích thiết kế phép tốn hợp lý mơ hình - Học sinh phải tập trung phải tận dụng thời gian giải lao để giải lao thật tốt Học phòng thực hành - Cài đặt cấu trúc liệu phép toán tương ứng - Áp dụng cấu trúc liệu phép toán để giải toán cụ thể - Học viên phải tập trung phải tận dụng thời gian giải lao để giải lao thật tốt U CẦU VỀ ĐÁNH GIÁ HỒN THÀNH MƠ ĐUN/MƠN HỌC Lý thuyết: Đánh giá thông qua kiểm tra trắc nghiệm : Dùng phần mềm thi trắc nghiệm Kiểm tra trắc nghiệm giấy máy tính Xây dựng ngân hàng câu hỏi, học viên nhận để phát sinh ngẫu nhiên chất lượng đề (trung bình, khá, giỏi, xuất sắc) Thời gian làm tuỳ theo số lượng câu đề Thang điểm 10 chia cho câu Kết đánh giá dựa vào làm theo điểm đạt Thực hành: Đánh giá thông qua khả giải hồn thành chương trình (đề kiểm tra) đề Thang điểm: (đánh giá câu hỏi trắc nghiệm) 0-49 : Khơng đạt 50-69 : Đạt trung bình 70-85 : Đạt 86-100 : Đạt Giỏi BÀI GIỚI THIỆU CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT MÃ BÀI: ITPRG 01.1 Giới thiệu Cấu trúc liệu giải thuật phần khơng thể thiếu q trình phát triển chương trình lập trình viên Để hiểu rõ Quý nghiên cứu khái niệm cấu trúc liệu giải thuật , kiến thức cấu trúc liệu giải thuật Đồng thời học sinh hình thành kỹ tâm lý để chuẩn bị cho Quý mang tính logic tư lớn Mục tiêu thực Học xong học viên có khả năng: - Hiểu giải thuật - Hiểu cấu trúc liệu - Mối quan hệ cấu trúc liệu giải thuật - Biết tính chất giải thuật - Phân tích giải thuật mặt thời gian, nhớ, tốc độ chương trình - Biết chia tốn thành mơđun nhỏ - Nắm nguyên tắc thiết kế giải thuật theo phương pháp top-down, chia để trị (stepwise refinement) - Biết cách dùng ngơn ngữ để diễn đạt giải thuật Nội dung 1.1 Giải thuật cấu trúc liệu Hằng ngày xử lý công việc theo kế hoạch định sẵn bao gồm bước để thực Chẳng hạn, để in văn viết tay phải thực hai bước quan trọng: Gõ văn In văn giấy, hai bước khơng thể thay đổi thứ tự Đây ý tưởng giải thuật Như vậy, giải thuật hệ thống chặt chẽ rõ ràng quy tắc nhằm xác định dãy thao tác (các bước) đối tượng cho số hữu hạn bước thực thao tác, đạt mục tiêu định trước Khi thiết kế giải thuật, phải đảm bảo đạt đặc trưng giải thuật: a) Tính xác định: Ở bước giải thuật, thao tác phải rõ ràng Không thể gây lẫn lộn, nhập nhằng, tuỳ tiện b) Tính hữu hạn dừng: Một giải thuật phải dừng lại sau số hữu hạn bước Có thể số lượng bước lớn c) Tính đắn: Sau thực thuật toán dừng lại, phải đạt kết yêu cầu d) Tính phổ biến: Thuật tốn giải tốn lớp tốn, có nghĩa thuật tốn xử lý với liệu khác e) Tính có đại lượng vào ra: Khi bắt đầu thuật toán lúc phải xác định đại lượng vào, thường lấy từ tập xác định cho trước; Sau kết thúc, thuật toán phải cho hay số đại lượng tuỳ theo chức mà thuật toán đảm nhiệm f) Tính hiệu quả: Được đánh giá cá đại lượng: Bộ nhớ cần có, số phép tính cần thực hiện, thời gian cần thiết để chạy, hiểu người không, dễ cài đặt hay khơng Trong đặc trưng đầu phải đáp ứng Tuy nhiên, giải thuật tác động liệu để đưa đến kết mong muốn Việc “tổ chức” phần tử liệu theo mối quan hệ chúng theo cấu trúc thích hợp để thực xử lý thuận lợi hơn, hiệu cao quan trọng Do đó, kết hợp kiểu liệu đơn giản để tạo kiểu liệu phù hợp hơn, kiểu liệu gọi cấu trúc liệu Thực đề án tin học chuyển toán thực tế thành tốn giải máy tính Một tốn thực tế bao gồm đối tượng liệu yêu cầu xử lý đối tượng Vì thế, để xây dựng mơ hình tin học phản ánh toán thực tế cần trọng đến hai vấn đề : Một toán cụ thể chuyển để giải máy tính bao gồm đốit tượng liệu yêu cầu xử lý đối tượng Do đó, cần phải trọng: - Tổ chức biểu diễn đối tượng thực tế : Các thành phần liệu thực tế đa dạng, phong phú thường chứa đựng quan hệ với nhau, mơ hình tin học tốn, cần phải tổ chức, xây dựng cấu trúc thích hợp cho vừa phản ánh xác liệu thực tế này, vừa dễ dàng dùng máy tính để xử lý Cơng việc gọi xây dựng cấu trúc liệu cho toán - Xây dựng thao tác xử lý liệu: Từ yêu cầu xử lý thực tế, cần tìm giải thuật tương ứng để xác định trình tự thao tác máy tính phải thi hành kết mong muốn, bước xây dựng giải thuật cho toán Tuy nhiên, giải tốn máy tính, thường có khuynh hướng trọng đến việc xây dựng giải thuật mà quên tầm quan trọng việc tổ chức liệu toán Giải thuật phản ánh phép xử lý , đối tượng xử lý giải thuật lại liệu, liệu chứa đựng thông tin cần thiết để thực giải thuật Để xác định giải thuật phù hợp cần phải biết tác động đến loại liệu (ví dụ để làm nhuyễn hạt đậu , người dùng cách xay không băm dao, đậu văng ngồi) chọn lựa cấu trúc liệu cần phải hiểu rõ thao tác tác động đến (ví dụ để biểu diễn Doanh thu cửa hàng người dùng số thực thay chuỗi ký cịn phải thực thao tác tính trung bình từ Doanh thu đó) Như đề án tin học, giải thuật cấu trúc liệu có mối quan hệ chặt chẽ với nhau, thể qua công thức : Cấu trúc liệu + Giải thuật = Chương trình Khi chọn lựu cấu trúc liệu, có giải thuật hay phép toán tương ứng, phù hợp Khi cấu trúc liệu thay đổi thường giải thuật phải thay đổi theo để tránh việc xử lý gượng ép, thiếu tự nhiên cấu trúc không phù hợp Hơn nữa, cấu trúc liệu tốt giúp giải thuật xử lý phát huy tác dụng tốt hơn, vừa đáp ứng nhanh vừa tiết kiệm vật tư, giải thuật dễ hiểu đơn giản Như vậy, giải thuật cấu trúc liệu có liên hệ mật thiết với nhau; Nếu thay đổi cấu trúc liệu giải thuật thay đổi theo để xử lý phù hợp với cấu trúc liệu nhằm đưa đến kết mong muốn Ví dụ 1: Một chương trình quản lý doanh thu cửa hàng cần lưu trữ doanh thu cửa hàng Do cửa hàng có doanh thu ứng với quý khác nên liệu có dạng bảng sau: Cửa hàng Quý Quý Quý Quý Số 10 Số 10 Số Chỉ xét thao tác xử lý xuất doanh thu Quý cửa hàng Giả sử có phương án tổ chức lưu trữ sau: Phương án : Sử dụng mảng chiều Có tất 3(cửa hàng)*4(Quý) = 12 doanh thu cần lưu trữ, khai báo mảng result sau : int result [ 12 ] = {7, 10, 8, 2, 8, 0, 10, 4, 6, 3, 7, 4}; mảng result phần tử lưu trữ sau: 10 Cửa hàng Số 10 Cửa hàng Số Cửa hàng Số Và truy xuất Doanh thu Quý j cửa hàng i - phần tử (dòng i, cột j) bảng - phải sử dụng công thức xác định số tương ứng mảng result: bảng doanh thu(dòng i, cột j) = result[((i-1)*số cột) + j] Ngược lại, với phần tử mảng, muốn biết Doanh thu cửa hàng nào, Q gì, phải dùng công thức xác định sau result[ i ] = bảng doanh thu (dòng((i / số cột) +1), cột (i % số cột) ) Với phương án này, thao tác xử lý cài đặt sau : void XuatDoanhThu() //Xuất Doanh thu tất cửa hàng { const int so_quy = 4; int cuahang,quy; for (int i=0; i numtrees-1 int nodesearch (NODEPTR p, int k) { int i; for(i=0; i< p->numtrees –1 && p->key[i] < k; i++); return (i); } Phép tốn nodesearch dùng để tìm khóa k có nút p hay khơng Nếu khóa k khơng có nút p phép tốn trả vị trí giúp chọn nút phù hợp p để tiếp tục tìm khóa k nút - Phép tốn SEARCH: Tìm khóa k B-Tree Con trỏ p xuất phát từ gốc xuống nhánh phù hợp để tìm khóa k có nút p hay khơng Nếu có khóa k nút p cây: + Biến found tra giá trị TRUE + Hàm search() trả trỏ nút p có chứa khóa k + Biến position trả vị trí khóa k có nút p Nếu khơng có khóa k cây: lúc p=NULL q(nút cha p) nút thêm khóa k vào nút + Biến found trả giá trị FALSE + Hàm search() trả trỏ q nút có thêm nút k vào + Biến position trả vị trí chèn khóa k vào nút q NODEPTR search(int k, int *pposition, int *pfound) { int i; NODEPTR p, q; q = NULL; p = Root; while (p !=NULL) { i = nodesearch (p, k); if(i< p->numtress–1 && k == p->key[i]) //tim thay { *pfound = TRUE; *pposition = i; // vi trí tìm thay khoa k return(p); // node co chua khoa k } q = p; p = p ->Branch[i]; } /*Khi thoat khoi vong lap tren la khong tim thay, luc p=NULL, q la node la co the them khoa k vao node nay, position la vi tri co the chen khoa k*/ *pfound = FALSE; *pposition = i; return (q); //tra ve node la } - Phép Duyệt: Duyệt khóa B-Tree theo thứ tự từ nhỏ đến lớn-bằng phương pháp đệ qui void traverse(NODEPTR proot) { int i; if(proot == NULL) //dieu kien dung return; else // de qui { /* vong lap duyet nhanh cay Branch[i] va in khoa key[i] cua node proo*/ for(i = 0; i < proot -> numtress-1; i++) { traverse (proot ->Branch[i]); printf ("%8d", proot -> key[i]); } //duyet nhanh cay cuoi cung cua node proot traverse (proot -> Branch[proot -> numtrees-1]); } } - Phép toán thêm vào: Trước đưa giải thuật thêm phần tử vào B-Tree, xem tình cụ thể qua ví dụ sau : Ví dụ 77: - Thêm x=22 vào B-Tree , Khóa 22 chưa có Nhưng khơng thể thêm vào node C node C đầy -Do tách node C thành hai node : node D cấp phát m+1 khóa chia cho node C D, khóa chuyển lên node cha A : Hình 4.15b Như vậy, việc thêm khóa vào B-Tree gây việc tách node việc tách node lan truyền ngược lên node cha, trường hợp đặc biệt lan truyền đến tận gốc B-Tree Ví dụ 78: Xem q trình tạo B-Tree từ dãy khóa sau : 20; 40 10 30 15; 35 26 18 22; 5; 13 46 27 32; 38 24 45 25 Sau thêm vào khóa 30 : Khi thêm vào 15 node bị đầy, trường hợp tạo thành node : phần tử 20 bị đẩy lên tạo thành node mới, phần tử lại chia cho node : node cũ chứa 10, 15 node thứ chứa 30,40 Thêm vào khóa 35, 7,26 18 Đến thêm khóa 22 có đầy node dẫn đến việc tách node: Thêm vào có đầy node (node chứa khóa 7, 10, 15, 18) dẫn đến việc tách node : Thêm vào khóa 42, 13, 46, 27 Đến thêm 32 có tách node : Thêm vào 38, 24 va 45 Thêm 25 vào có tách node cho thấy lan truyền tách node ngược lên phía gốc : 25 thêm vào node (22, 24 26, 27) làm node bị tách 25 đưa lên node cha (10, 20, 30, 40) làm node bị tách thành node khoá 25 đưa lên thành node gốc Phép tốn INSERT Thêm khóa k vào vị trí position nút s (s position phép toán search() trả về) + Nếu nút s chưa đầy: gọi phép tốn insnode để chèn khóa k vào nút s + Nếu nút s đầy: tách nút thành nút nửa trái nửa phải void insert (NODEPRT s, int k, int position) { NODEPRT nd, nd2, f, newnode; int pos, newkey, midkey; //khoi ñong cac tri truoc vao tron vong lap tach cac node day nd nd = s; newkey = k; newnode = NULL; // vi nd la node la nen gan newnode la NULL pos = position; f = father (nd); // Vong lap tach cac node day nd while (f != NULL && nd -> nemtrees == ODER) { split(nd, newkey, newnode, pos, &nd2, &midkey); // Gan lai cac tri sau lan tach node truoc nd = f; newkey = midkey; newnode = nd2; pos = nedesearch (f, midkey); f = father (nd); } // Truong hop node nd chua day va nd khong phai la node goc if(nd - > numtrees < ORDER) { //chen newkey va newnode tai vi tri pos cua node nd insnode (nd, newkey, newnode, pos); return; } //Truong hop node nd la node goc bi day, tach node goc va tao node goc moi split (nd, newkey, newnode, pos, &nd2, &midkey); Root = makeroot (midkey); // tao node goc moi // Gan lai hai nhanh cay cua node goc moi la nd va nd2 Root -> Branch[0] = nd; Root -> Branch[1] = nd2; } Khi thêm khóa vào B-Tree viết sau: printf("\n Noi dung khoa moi: "); scanf("%d", &k); // truong hop B-Tree bi rong tao node goc if(Root == NULL) Root = makeroot(k); else { s = search(k, &pos, &timthay); if(timthay) printf("Bi trung khoa, khong them khoa %d vao B-Tree ñuoc", k); else insert (s, k, pos); } - Phép toán SPLIT: Tách node đầy nd, phép toán gọi phép toán INSERT - nd nút đầy bị tách, sau tách xong nút nd lại nửa số khóa bên trái - newkey, newnode pos khóa mới, nhánh vị trí chèn vào nút nd -Nút nd2 nút nửa phải có sau lần tách, nút nd2 chiếm nửa số khóa bên phải - Midkey khó sẻ d9uoc757 chèn vào nút cha void split (NODEPTR nd, int newkey, NODEPTR newnode, int pos, NODEPTR *pnd2, int *pmidkey) { NODEPTR p; P = getnode(); //cap phat node nua phai /*truong hop chen newkey va newnode vao node nua phai*/ if(pos > Ndiv 2) { copy(nd, Ndiv 2+1, ORDER – 2, p); insnode (p, newkey, newnode, pos-Ndiv -1); nd->numtrees = Ndiv 2+1; /*so nhanh cay con lai cua node nua trai*/ *pmidkey = nd -> key[Ndiv2]; *pnd2 = p; return; } // truong hop newkey la midkey if(pos == Ndiv2) { copy(nd, Ndiv2, ORDER-2, p); nd->numtrees = Ndiv 2+1; /*so nhanh cay con lai cua node nua trai*/ /*Dieu chinh lai node dau tien cua node nua phai*/ p -> Branch[0] = newnode; *pmidkey = nd -> key[Ndiv2]; *pnd2 = p; return; } /* Truong hop chen newkey va newnode vao node nua trai*/ if(pos < Ndiv2) { copy(nd, Ndiv2, ORDER-2, p); nd->numtrees = Ndiv 2+1; /*so nhanh cay con lai cua node nua trai*/ *pmidkey = nd -> key[Ndiv2 - 1]; insnode(nd, newkey, newnode, pos); *pnd2 = p; return; } } - Phép tốn INSNODE Chèn khóa newkey vào vị trí pos nút chưa đầy p,và chèn nhánh newnode vào vị trí bên phải cuả khóa newkey void insnode (NODEPTR p, int newkey, NODEPTR newnode, int pos) { int i; /*doi cac nhanh cay va cac khoa tu vi tri pos tro ve sau xuong mot vi tri*/ for(i = p->numtress – 1; i >= pos+1; i ) { p -> Branch[i+1] = p -> Branch[i]; p -> key[i] = p -> key[i - 1]; } // gan khoa newkey vao vi tri pos p -> key[pos] = newkey; // Gan nhanh newnode la nhanh cay ben phai cua khoa newkey p -> Branch[pos + 1] = newnode; //tang so nhanh cay cua node p len p -> numtrees +=1; } Phép toán COPY Chép khóa (và nhánh con) từ vị trí first đến vị trí fast nút nd (nút nửa trái) sang nút nd2 (nửa nút phải) Phép toán gọi phép toán split void copy(NODEPTR nd, int first, int last, NODPTR nd2) { int i; // copy cac khoa tu node nd qua node nd2 for(i = first; i < last, i++) nd2 -> key[i-first] = nd -> key[i]; // copy caùc nhanh cay tu node nd qu nd2 for(i = first; i < last+1, i++) nd2 -> con[i-first] = nd -> Branch[i]; nd2 ->numtrees = last – first +2 // so nhanh cay cua node nd2 } 5.5 Bài tập mẫu nghiên cứu thêm Bài tập 1: Viết chương trình nhập dãy số nguyên vào (số nguyên gốc), in cách duyệt cây: - Duyệt theo thứ tự trước - Duyệt theo thứ tự sau - Duyệt theo thứ tự Bài tập 2: Thiết kế kiểu liệu phù hợp để lưu trữ xử lý tam phân Bài Hãy trình bày vấn đề sau đây: a Định nghĩa đặc điểm nhị phân tìm kiếm b Thao tác thực tốt kiểu c Hạn chế kiểu ? Bài tập Xét thuật giải tạo nhị phân tìm kiếm Nếu thứ tự khóa nhập vào sau: 20 11 30 18 hình ảnh tạo ? Sau đó, hủy nút theo thứ tự sau : 15, 20 thay đổi bước hủy, vẽ sơ đồ (nêu rõ phương pháp hủy nút có trái phải) Bài tập Áp dụng thuật giải tạo nhị phân tìm kiếm cân để tạo với thứ tự khóa nhập vào sau : 10 hình ảnh tạo ? Giải thích rõ tình xảy thêm khóa vào vẽ hình minh họa Sau đó, hủy nút theo thứ tự sau : 5, 6, 7, 10 thay đổi bước hủy, vẽ sơ đồ giải thích Bài tập Viết hàm xác định thông tin nhị phân T: a Số nút b Số nút có c Số nút có d Số nút có khóa nhỏ x (giả sử T nhị phân tìm kiếM) e Số nút có khóa lớn x (giả sử T nhị phân tìm kiếm) f Số nút có khóa lớn x nhỏ y (T nhị phân tìm kiếM) g Chiều cao h In tất nút tầng (mức) thứ k T i In tất nút theo thứ tự từ tầng đến tầng thứ h-1 T (h chiều cao T) j Kiểm tra xem T có phải cân hồn tồn khơng k Độ lệch lớn (Độ lệch nút độ lệch chiều cao trái phải Độ lệch lớn độ lệch nút có độ lệch lớn nhất) Bài tập Xây dựng cấu trúc liệu biễu diễn N-phân (2

Ngày đăng: 18/01/2022, 09:29

Từ khóa liên quan

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

Tài liệu liên quan