以下是一个简单的二叉搜索树(Binary Search Tree, BST)的 C++ 实现,包含插入、删除、查找和遍历等基本操作:
#include <iostream> using namespace std; // 树节点结构 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; class BST { private: TreeNode* root; // 插入节点(递归辅助函数) TreeNode* insertHelper(TreeNode* node, int val) { if (!node) return new TreeNode(val); if (val < node->val) node->left = insertHelper(node->left, val); else node->right = insertHelper(node->right, val); return node; } // 查找最小节点(用于删除操作) TreeNode* findMin(TreeNode* node) { while (node->left) node = node->left; return node; } // 删除节点(递归辅助函数) TreeNode* deleteHelper(TreeNode* node, int val) { if (!node) return nullptr; if (val < node->val) node->left = deleteHelper(node->left, val); else if (val > node->val) node->right = deleteHelper(node->right, val); else { // 情况1:叶子节点或仅有一个子节点 if (!node->left) return node->right; if (!node->right) return node->left; // 情况2:有两个子节点 TreeNode* successor = findMin(node->right); node->val = successor->val; node->right = deleteHelper(node->right, successor->val); } return node; } // 中序遍历(递归) void inorderHelper(TreeNode* node) { if (!node) return; inorderHelper(node->left); cout << node->val << " "; inorderHelper(node->right); } public: BST() : root(nullptr) {} // 插入操作 void insert(int val) { root = insertHelper(root, val); } // 删除操作 void remove(int val) { root = deleteHelper(root, val); } // 查找操作 bool search(int val) { TreeNode* cur = root; while (cur) { if (val == cur->val) return true; cur = (val < cur->val) ? cur->left : cur->right; } return false; } // 中序遍历 void inorder() { inorderHelper(root); cout << endl; } }; int main() { BST tree; tree.insert(50); tree.insert(30); tree.insert(70); tree.insert(20); tree.insert(40); cout << "中序遍历: "; tree.inorder(); // 输出: 20 30 40 50 70 cout << "查找40: " << (tree.search(40) ? "存在" : "不存在") << endl; cout << "删除30后: "; tree.remove(30); tree.inorder(); // 输出: 20 40 50 70 }核心操作说明
插入
- 递归找到合适位置创建新节点
- 时间复杂度:$O(h)$($h$为树高度)
删除
- 分三种情况处理:
- 叶子节点:直接删除
- 单子节点:用子节点替换
- 双子节点:用后继节点(右子树最小节点)替换
- 时间复杂度:$O(h)$
- 分三种情况处理:
查找
- 从根节点开始逐层比较
- 时间复杂度:$O(h)$
遍历
- 中序遍历可输出有序序列
- 时间复杂度:$O(n)$($n$为节点数)
注意:二叉搜索树的性能取决于树的高度$h$。理想情况下$h = \log_2 n$(平衡树),最坏情况下$h = n$(退化为链表)。如需优化可研究平衡二叉搜索树(如 AVL 树、红黑树)。