− Tất cả các giá trị trên cây con trái của X nhỏ hơn X − Tất cả các giá trị trên cây con phải của X lớn hơn X.. Đây có phải là cây nhị phân tìm kiếm?.[r]
(1)Cây nhị phân tìm kiếm (Binary Search Trees)
Nguyễn Mạnh Hiển
(2)Định nghĩa
• Xét trường hợp phần tử có giá trị khác
• Cây nhị phân tìm kiếm nhị phân, với mọi nút X:
(3)(4)Các thao tác
• Tìm phần tử nhỏ • Tìm phần tử lớn • Tìm phần tử x
• Chèn phần tử x • Xóa phần tử x
(5)Cài đặt
template <typename T> // T kiểu phần tử class BinarySearchTree {
public:
hàm tạo, hàm hủy kiểm tra rỗng xóa rỗng
tìm min, tìm max, tìm phần tử x chèn/xóa phần tử x
private:
struct BinaryNode { }; // kiểu nút BinaryNode * root; // trỏ tới nút gốc hàm trợ giúp
(6)Kiểu nút
struct BinaryNode { T elem;
BinaryNode * left; BinaryNode * right;
BinaryNode(T x, BinaryNode * l, BinaryNode * r) { elem = x;
left = l; right = r; }
(7)Hàm tạo, hàm hủy, xóa rỗng
BinarySearchTree() { root = NULL;
}
~BinarySearchTree() { makeEmpty();
}
void makeEmpty() { // hàm xóa rỗng
makeEmpty(root); // gọi hàm private trợ giúp }
bool isEmpty() { // hàm kiểm tra rỗng return (root == NULL);
(8)Xóa rỗng có gốc t
// Hàm private trợ giúp xóa rỗng void makeEmpty(BinaryNode * & t) { if (t == NULL)
return; // rỗng makeEmpty(t->left); // xóa trái
makeEmpty(t->right); // xóa phải delete t; // xóa nút gốc
(9)Tìm phần tử nhỏ
// Hàm public T findMin() {
BinaryNode * v = findMin(root); // gọi hàm private return v->elem;
}
// Hàm private trợ giúp (dùng đệ quy) BinaryNode * findMin(BinaryNode * t) { if (t == NULL) // rỗng? return NULL;
if(t->left == NULL) // nút bên trái? return t;
(10)Tìm phần tử lớn
// Hàm public T findMax() {
BinaryNode * v = findMax(root); // gọi hàm private return v->elem;
}
// Hàm private trợ giúp (không dùng đệ quy) BinaryNode * findMax(BinaryNode * t) {
if (t != NULL)
while (t->right != NULL) // chưa đến tận cùng? t = t->right; // tiếp sang bên phải return t;