#include <iostream>
using namespace std;
// Cấu trúc nút cây
struct Node {
int data;
Node* left;
Node* right;
};
// Tạo nút mới
Node* createNode(int value) {
Node* newNode = new Node();
newNode->data = value;
newNode->left = newNode->right = nullptr;
return newNode;
}
// Thêm phần tử vào BST
Node* insert(Node* root, int value) {
if (root == nullptr)
return createNode(value);
if (value < root->data)
root->left = insert(root->left, value);
else if (value > root->data)
root->right = insert(root->right, value);
// Nếu value == root->data thì bỏ qua (không thêm trùng)
return root;
}
// Duyệt cây theo thứ tự giữa (inorder)
void inorder(Node* root) {
if (root != nullptr) {
inorder(root->left);
cout << root->data << " ";
inorder(root->right);
}
}
// Tìm phần tử
bool search(Node* root, int key) {
if (root == nullptr)
return false;
if (key == root->data)
return true;
else if (key < root->data)
return search(root->left, key);
else
return search(root->right, key);
}
// Tìm node nhỏ nhất trong cây con
Node* findMin(Node* root) {
while (root->left != nullptr)
root = root->left;
return root;
}
// Xoá phần tử trong BST
Node* deleteNode(Node* root, int key) {
if (root == nullptr) return root;
if (key < root->data)
root->left = deleteNode(root->left, key);
else if (key > root->data)
root->right = deleteNode(root->right, key);
else {
// Node cần xoá có 1 hoặc 0 con
if (root->left == nullptr) {
Node* temp = root->right;
delete root;
return temp;
}
else if (root->right == nullptr) {
Node* temp = root->left;
delete root;
return temp;
}
// Node có 2 con: tìm node nhỏ nhất bên phải
Node* temp = findMin(root->right);
root->data = temp->data; // Gán giá trị nhỏ nhất
root->right = deleteNode(root->right, temp->data); // Xoá node nhỏ nhất
}
return root;
}
// ================================
int main() {
Node* root = nullptr;
// Thêm phần tử
root = insert(root, 50);
insert(root, 30);
insert(root, 70);
insert(root, 20);
insert(root, 40);
insert(root, 60);
insert(root, 80);
cout << "Duyet Inorder: ";
inorder(root);
cout << endl;
int key = 40;
cout << "Tim " << key << ": " << (search(root, key) ? "Co" : "Khong") << endl;
root = deleteNode(root, 30);
cout << "Sau khi xoa 30: ";
inorder(root);
cout << endl;
return 0;
}