Cây tìm kiếm nhị phân:
Cây tìm kiếm nhị phân (viết tắt tiếng Anh: BST - Binary Search Tree) là một cấu trúc dữ liệu rất thuận lợi cho bài toán tìm kiếm.Cây tìm kiếm ứng với n khóa là cây nhị phân mà mỗi nút đều được gán một khóa sao cho với mỗi mỗi nút k:
Mọi khóa trên cây con trái đều nhỏ hơn khóa trên nút k
Mọi khóa trên cây con phải đều lớn hơn khóa trên nút k
Nếu một BST có chứa các giá trị giống nhau thì nó biểu diễn một đa tập hợp. Cây loại này sử dụng các bất đẳng thức không nghiêm ngặt. Mọi nút trong cây con trái có khóa nhỏ hơn khóa của nút cha, mọi nút trên cây con phải có nút lớn hơn hoặc bằng khóa của nút cha.
Nếu một BST không chứa các giá trị giống nhau thì nó biểu diễn một tập hợp đơn trị như trong lý thuyết tập hợp. Cây loại này sử dụng các bất đẳng thức nghiêm ngặt. Mọi nút trong cây con trái có khóa nhỏ hơn khóa của nút cha, mọi nút trên cây con phải có nút lớn hơn khóa của nút cha.
Việc chọn đưa các giá trị bằng nhau vào cây con phải (hay trái) là tùy theo mỗi người. Một số người cũng đưa các giá trị bằng nhau vào cả hai phía, nhưng khi đó việc tiìm kiếm trở nên phức tạp hơn.
Các phép toán trên BST
Tìm kiếm (Searching):
Việc tìm một khóa trên BST có thể thực hiện nhờ đệ quy. Chúng ta bắt đầu từ gốc. Nếu khóa cần tìm bằng khóa của gốc thì khóa đó trên cây, nếu khóa cần tìm nhỏ hơn khoa ở gốc, ta phải tìm nó trên cây con trái, nếu khóa cần tìm lớn hơn khóa ở gốc, ta phải tìm nó trên cây con phải. Nếu cây con (trái hoặc phải) là rỗng thì khóa cần tìm không có trên cây.Search_binary_tree(node, key):
{
if node is Null then
return; None /* key not found */
if key < node.key:
return search binary_tree(node.left, key);
else
if key > node.key return search_binary_tree(node.right, key)
else /* key is equal to node key */
return node.value; # found key
}
Thời gian tìm kiếm trung bình là O(log n), và là O(n) khi cây là không cân bằng chỉ là một danh sách liên kết.
Chèn (Insertion):
Phép chèn bắt đầu giống như phép tìm kiếm; Nếu khóa của gốc khác khóa cần chèn ta tìm nó trong cây con trái hoặc phải. Nếu cây con trái hoặc phải tương ứng là rỗng (không tìm thấy) thì thêm một nút và gán cho nút ấy khóa cần chèn.Sau đây là mã trong C++ :
void InsertNode(struct node *&treeNode, struct node *newNode)
{ //Inserts node pointered by "newNode" to the subtree started by "treeNode"
if (treeNode == NULL)
treeNode = newNode; //Only changes "node" when it is NULL
else if (newNode->value < treeNode->value)
InsertNode(treeNode->left, newNode);
else
InsertNode(treeNode->right, newNode);
}
Xóa (Deletion)
Xét các trường hợp sau:Xóa một lá: Vì lá không có con nên chỉ cần giải phóng nó khỏi cây.
void DeleteNode(struct node*& node) {
0 nhận xét:
Đăng nhận xét
Click to see the code!
To insert emoticon you must added at least one space before the code.