C++中的二叉搜索树基础
二叉搜索树(Binary Search Tree,简称 BST)是一种特殊的二叉树结构,它具有以下几个特点:
- 每个节点最多有两个子节点。
- 左子树上所有节点的值都小于根节点的值。
- 右子树上所有节点的值都大于根节点的值。
- 左右子树本身也是二叉搜索树。
二叉搜索树可以用来高效地查找、插入和删除数据,时间复杂度平均为 O(log n),但在最坏的情况下(例如,输入数据是已排序的),时间复杂度会退化到 O(n)。
下面是一个简单的 C++ 实现二叉搜索树的示例,包括节点定义、插入和查找操作:
#include <iostream>
// 定义二叉搜索树的节点结构
struct TreeNode {
int value;
TreeNode* left;
TreeNode* right;
TreeNode(int val) : value(val), left(nullptr), right(nullptr) {}
};
// 插入新节点到二叉搜索树
TreeNode* insert(TreeNode* root, int value) {
if (root == nullptr) {
return new TreeNode(value);
}
if (value < root->value) {
root->left = insert(root->left, value);
} else if (value > root->value) {
root->right = insert(root->right, value);
}
return root;
}
// 查找二叉搜索树中的值
bool search(TreeNode* root, int value) {
if (root == nullptr) {
return false;
}
if (value == root->value) {
return true;
} else if (value < root->value) {
return search(root->left, value);
} else {
return search(root->right, value);
}
}
// 递归释放内存
void deleteTree(TreeNode* root) {
if (root == nullptr) {
return;
}
deleteTree(root->left);
deleteTree(root->right);
delete root;
}
int main() {
TreeNode* root = nullptr;
// 插入节点
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// 搜索节点
std::cout << "Search 40: " << (search(root, 40) ? "Found" : "Not Found") << std::endl;
std::cout << "Search 25: " << (search(root, 25) ? "Found" : "Not Found") << std::endl;
// 释放内存
deleteTree(root);
return 0;
}
插入操作
- 从树根开始,将待插入节点的值与当前节点的值相比较。
- 如果小于当前节点的值,则递归地向左子树插入。
- 如果大于当前节点的值,则递归地向右子树插入。
- 如果等于当前节点的值,通常忽略插入以避免重复元素(可以根据需求调整)。
查找操作
- 和插入类似,从树根开始比较目标值与当前节点的值。
- 如果小于当前节点的值,递归地在左子树查找。
- 如果大于当前节点的值,递归地在右子树查找。
- 如果找到了相等的值,返回 true,否则为 false。
这些基本操作可以扩展为更加复杂的功能,比如删除节点、遍历树等等。如果你有任何具体问题或进阶需求,可以在问答社区中提问!