//ta lấy node trái nhất của cây con phải
node* temp = minValueNode(root->right);
root->data = temp->data; //thay thế nội dung node cần loại bỏ
root->right = deleteNode(root->right, temp->data);//loại bỏ node thay thế
}
return root; }
void BST::Function(void) {
node *tmp; int value, choice; do {
cout<<"\n CÂY NHỊ PHÂN TÌM KIẾM"; cout<<"\n 1. Thêm node vào cây BST"; cout<<"\n 2. Loại node trên cây BST "; cout<<"\n 3. Tìm node trên cây BST "; cout<<"\n 4. Duyệt theo thứ tự trước"; cout<<"\n 5. Duyệt theo thứ tự giữa "; cout<<"\n 6. Duyệt theo thứ tự sau "; cout<<"\n 0. Thoát ";
cout<<"\n Đưa vào lựa chọn:";cin>>choice; switch(choice) {
case 1:
cout<<"\n Giá trị node cần thêm:"; cin>> value; root = insert(root, value);break;
case 2:
cout<<"\n Giá trị node cần loại:"; cin>> value; root = deleteNode(root, value);break;
case 3:
cout<<"\n Giá trị node cần tìm:"; cin>> value; tmp = search(root, value);
if (tmp==NULL) cout<<"\n Node không có trên cây"; else cout<<"\n Node "<< tmp->value<<”có trên cây”; break;
case 4: preorder(root); break; case 5: inorder(root); break; case 6: postorder(root); break; default:
NGUYỄN DUY PHƯƠNG 155 } }
cout<<"\n Duyệt trước:"; preorder(root); cout<<"\n Duyệt sau:"; inorder(root); cout<<"\n Duyệt giữa:"; postorder(root);
}while(choice!=0); }
int main(){
BST X; X.Function(); }
5.6. Cây nhị phân tìm kiếm cân bằng
Tìm kiếm trên cây BST không cải thiện được nhiều so với cây nhị phân thông thường. Độ phức tạp thuật toán tìm kiếm node trên cây BTS trong trường hợp tốt nhất là log(N), trong trường hợp xấu nhất là O(N), với N là số node trên cây. Trường hợp xấu nhất xảy ra khi cây nhị phân tìm kiếm là cây lệch trái hoặc cây lệnh phải. Trường hợp tốt nhất xảy ra khi cây nhị phân tìm kiếm có độ cao là Log2(N). Giảm chiều sâu (độ cao) của các cây nhị phân tìm kiếm để cải thiện thời gian tìm kiếm node trên cây là mục tiêu chính của cây nhị phân tìm kiếm cân bằng.
5.6.1. Định nghĩa cây nhị phân tìm kiếm cân bằng
Cây tìm nhị phân tìm kiếm cân bằng có tính chất độ cao của cây con bên trái và độ cao cây con bên phải luôn lệch nhau không quá 1. Hình 4.18 là một cây nhị phân tìm kiếm tự cân bằng (AVL).
Hình 4.18. Ví dụ về cây AVL
Gọi lh(p) , rh(p) là chiều sâu của cây con phải và chiều sâu của cây con trái. Khi đó, bf(p) = lh(p) – rh(p) được gọi là chỉ số cân bằng của node p.Dựa vào chỉ số cân bằng của node, ta có thể xác định một cây con gốc p mất cân bằng các trường hợp sau: