III. Lập trình dựa vào ngăn xếp, hàng đợi
4.2. Cây nhị phân tìm kiếm
BÀI 4.2.1:
Xây dựng cấu trúc cây nhị phân tìm kiếm với các hàm sau: a) Nhập và duyệt cây theo các thứ tự: trước, giữa và sau. b) Tìm node có giá trị x trên cây.
c) Tìm node có giá trị nhỏ nhất. d) Tìm node có giá trị lớn nhất. e) Tính độ cao của cây.
f) Đếm số nút lá của cây.
g) Đếm số nút có đúng 2 cây con. h) Đếm số nút có đúng 1 cây con. i) Xóa nút có giá trị x.
BÀI 4.2.2:
Cho một cây nhị phân tìm kiếm. Mỗi node trên cây có info là một số nguyên và liên kết chỉ đến cây con trái và cây con phải.
a. Tính số node, số node lá, số node nhánh trên cây. b. Tính chiều cao của cây.
c. Tính độ dài của cây.
d. Tính tổng giá trị của các node trên cây.
e. Nhập vào một số nguyên x. Viết thủ tục tìm x trên cây . Nếu tìm thấy hãy in ra màn hình giá trị của các node lớn hơn x.
f. Duyệt cây nhị phân theo các phương pháp NLR, LNR, LRN. PTIT
101
BÀI 4.2.3:
Viết hàm kiểm tra cây nhị phân T có phải là "cây nhị phân tìm kiếm" hay không?
BÀI 4.2.4:
Viết chương trình quản lý lịch công tác trong tháng đơn giản: cho phép nhập vào nội dung công việc cần làm theo ngày, theo giờ. Trong một ngày có thể có nhiều công việc, mỗi công việc có giờ bắt đầu , tên công việc, nội dung công việc, tính chất công việc {rất quan trọng, quan trọng, bình thường, ko cần thiết}…
Chương trình có các chức năng chính như sau:
Nhập nội dung công việc cần làm theo ngày, theo giờ Xem lịch công tác theo ngày yêu cầu
Xem các công việc theo tính chất: rất quan trọng, quan trọng… Xem các công việc đã hoàn tất
Xem các công việc ch ưa thực hiện Xem các công việc từ ngày a đến ngày b
Xóa hay điều chỉnh lịch công tác. Nếu sau khi điều chỉnh, ngày nào không còn việc phải làm sẽ xóa khỏi lịch công tác.
Yêu cầu: chương trình có càiđặt cây nhị phân tìm kiếm (BST): Mỗi nút trên cây BST là một ngày của lịch công tác
Trong mỗi nút ngày trên cây lại chứa một danh sách liên kết lưu thông tin các công việc.
Khi thêm một công việc vào một ngày đã tồn tại trên cây, thì công việc này sẽ được đưa vào danh sách liên kết chứa các công việc theo thứ tự tăng dần của giờ bắt đầu. Hình vẽ minh họa cấu trúc cây lịch công tác:
102
Hình: Cấu trúc cây lịch công tác
Nâng cao ( không bắt buộc, dành cho sinh viên khá, giỏi )
Thay danh sách liên kết chứa công việc trong ngày thành cây nhị phân tìm kiếm, khóa để xây dựng cây BST con là giờ bắt đầu!
Hình: Cấu trúc cây lịch công tác nâng cao
103
BÀI 4.2.5:
Xét thuật giải tạo cây nhị phân tìm kiếm. Nếu thứ tự các khoá nhập vào là như sau:8, 3, 5, 2, 20, 11, 30, 9, 18, 4 thì hình ảnh cây tạo được như thế nào ? sau đó, nếu hủy lần lượt các nút 5, 20 ( theo thứ tự đó) thì cây sẽ thay đổi như thế nào trong từng bước hủy (vẽ lại cây cho mỗi bước).
BÀI 4.2.6:
Hãy đưa ra một cài đặt đệ quy của thuật toán nhị phân tìm kiếm.
BÀI 4.2.7:
Giả sử a[i] = 2i với 1 < = i < = N. Có bao nhiêu vị trí trong bảng được kiểm tra khi dùng tìm kiếm nội suy trong trường hợp tìm kiếm không thành công cho 2k - 1?
BÀI 4.2.8:
Vẽ ra cây nhị phân tìm kiếm có được khi chèn các mẩu tin với các khóa E A S Y Q U E T I O N vào một cây rỗng đã khởi tạo.
BÀI 4.2.9:
Hãy sửa cây nhị phân tìm kiếm sao cho nó lưu tất cả các khóa bằng nhau trong cây. (nếu bấy kỳ node khác trong cây có cùng khóa với một node đã cho thì hoặc cha của nó hoặc một trong các con của nó nên có cùng khóa.)
BÀI 4.2.10:
Viết một chương trình không đệ quy để in ra các khóa trong cây nhị phân tìm kiếm theo thứ tự của khóa.
BÀI 4.2.11:
Vẽ một cây nhị phân tìm kiếm có được khi chèn các mẩu tin với các khóa E A S Y Q U E T I O N vào một cây rỗng đã khởi tạo, và tiếp đó xóa Q.
BÀI 4.2.12:
Ta định nghĩa một từ là dãy các kí tự không chứa khoảng trống (space), dấu tab, dấu xuống dòng (‘\n’), dấu về đầu dòng (‘\r’) và dấu kết thúc dòng (‘\0’). Tần xuất xuất hiện của từ W trong tập văn bản D1 và D2, ký hiệu là P(W) được tính theo công thức:
104 ) ( ) ( ) ( ) ( ) ( 2 1 2 1 D N D N W N W N W P
; trong đó Ni(W) là số lần xuất hiện từ W trong Di, N(Di) là tổng số từ của tập văn bản Di (i=1, 2).
Cho hai file văn bản data1.in và data2.in. Sử dụng cây nhị phân tìm kiếm, hãy tìm tập các từ và tần xuất xuất hiện của mỗi từ hoặc xuất hiện trong data1.in hoặc xuất hiện trong data2.in. Tập các từ tìm được ghi lại trong file Ketqua.out theo khuôn dạng:
Dòng đầu tiên ghi lại số tự nhiên K là số từ W tìm được theo yêu cầu của bài toán. K dòng kế tiếp, mỗi dòng ghi lại một từ W và tần xuất xuất hiện P(W) thỏa mãn yêu
cầu của bài toán. W và P(W) được viết cách nhau bởi một vài khoảng trống. Ví dụ với file data1.in và data2.in dưới đây sẽ cho ta file Ketqua.out của bài toán.
data1.in data2.in Ketqua.out
AB AC AD AE AF AB AC AD AE AF AB AC AD AH AK AB AC AD AH AK 7 AB 0.2 AC 0.2 AD 0.2 AE 0.1 AF 0.1 AH 0.1 AK 0.1 BÀI 4.2.13:
Ta định nghĩa một từ là dãy các kí tự không chứa khoảng trống (space), dấu tab, dấu xuống dòng (‘\n’), dấu về đầu dòng (‘\r’) và dấu kết thúc dòng (‘\0’). Tần xuất xuất hiện của từ W trong tập văn bản D1 và D2, ký hiệu là P(W) được tính theo công thức:
) ( ) ( ) ( ) ( ) ( 2 1 2 1 D N D N W N W N W P
; trong đó Ni(W) là số lần xuất hiện từ W trong Di, N(Di) là tổng số từ của tập văn bản Di (i=1, 2).
Cho hai file văn bản data1.in và data2.in. Sử dụng cây nhị phân tìm kiếm, hãy tìm tập các từ và tần xuất xuất hiện của các từ xuất hiện trong file data1.in nhưng không xuất hiện trong file data2.in. Tập các từ tìm được ghi lại trong file Ketqua.out theo khuôn dạng:
105
Dòng đầu tiên ghi lại số tự nhiên K là số từ W tìm được theo yêu cầu của bài toán. K dòng kế tiếp, mỗi dòng ghi lại một từ W và tần xuất xuất hiện P(W) thỏa mãn yêu
cầu của bài toán. W và P(W) được viết cách nhau bởi một vài khoảng trống. Ví dụ với file data1.in và data2.in dưới đây sẽ cho ta file Ketqua.out của bài toán.
data1.in data2.in Ketqua.out
AB AC AD AE AF AB AC AD AE AF AB AC AD AH AK AB AC AD AH AK 2 AE 0.1 AF 0.1 BÀI 4.2.14:
Ta định nghĩa một từ là dãy các kí tự không chứa khoảng trống (space), dấu tab, dấu xuống dòng (‘\n’), dấu về đầu dòng (‘\r’) và dấu kết thúc dòng (‘\0’). Tần xuất xuất hiện của từ W trong tập văn bản D1 và D2, ký hiệu là P(W) được tính theo công thức:
) ( ) ( ) ( ) ( ) ( 2 1 2 1 D N D N W N W N W P
; trong đó Ni(W) là số lần xuất hiện từ W trong Di, N(Di) là tổng số từ của tập văn bản Di (i=1, 2).
Cho hai file văn bản data1.in và data2.in. Sử dụng cây nhị phân tìm kiếm, hãy tìm tập các từ và tần xuất xuất hiện của mỗi từ trong cả hai tập data1.in và data2.in. Tập các từ tìm được ghi lại trong file Ketqua.out theo khuôn dạng:
Dòng đầu tiên ghi lại số tự nhiên K là số từ W tìm được theo yêu cầu của bài toán. K dòng kế tiếp, mỗi dòng ghi lại một từ W và tần xuất xuất hiện P(W) thỏa mãn yêu
cầu của bài toán. W và P(W) được viết cách nhau bởi một vài khoảng trống. Ví dụ với file data1.in và data2.in dưới đây sẽ cho ta file Ketqua.out của bài toán.
data1.in data2.in Ketqua.out
AB AC AD AE AF AB AC AD AE AF AB AC AD AH AK AB AC AD AH AK 3 AB 0.2 AC 0.2 PTIT
106
AD 0.2