− 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]
Trang 1Cây nhị phân tìm kiếm (Binary Search Trees)
Nguyễn Mạnh Hiển
hiennm@tlu.edu.vn
Trang 2Định nghĩa
• Xét trường hợp các phần tử có giá trị khác nhau
• Cây nhị phân tìm kiếm là cây nhị phân, trong đó với mọi nút X:
− 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
Trang 3Đây có phải là cây nhị phân tìm kiếm?
Trang 4Các thao tác chính
• Tìm phần tử nhỏ nhất
• Tìm phần tử lớn nhất
• Tìm phần tử x
• Chèn phần tử x
• Xóa phần tử x
Tất cả các thao tác trên có thời gian chạy trung bình
là O(log N) sẽ chứng minh sau
Trang 5Cài đặt
template <typename T> // T là 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 cây
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 của các nút BinaryNode * root; // con trỏ tới nút gốc các hàm trợ giúp
};
Trang 6Kiểu của các nút
struct BinaryNode {
T elem;
BinaryNode * left;
BinaryNode * right;
BinaryNode(T x, BinaryNode * l, BinaryNode * r) { elem = x;
left = l;
right = r;
}
};
Trang 7Hàm tạo, hàm hủy, xóa rỗng
BinarySearchTree() {
root = NULL;
}
~BinarySearchTree() {
makeEmpty();
}
void makeEmpty() { // hàm xóa rỗng cây
makeEmpty(root); // gọi hàm private trợ giúp }
bool isEmpty() { // hàm kiểm tra rỗng
return (root == NULL);
}
Trang 8Xóa rỗng cây có gốc t
// Hàm private trợ giúp xóa rỗng cây
void makeEmpty(BinaryNode * & t) {
if (t == NULL)
return; // thoát ra nếu cây rỗng
makeEmpty(t->left); // xóa cây con trái
makeEmpty(t->right); // xóa cây con phải
delete t; // xóa nút gốc
t = NULL;
}
Trang 9Tìm phần tử nhỏ nhất
// 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) // cây rỗng?
return NULL;
if(t->left == NULL) // nút ngoài cùng bên trái? return t;
return findMin(t->left); // tìm trên cây con trái }
Trang 10Tìm phần tử lớn nhất
// 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; // đi tiếp sang bên phải return t;
}