C++ 二叉搜索树原理与实现
概念与性能分析
二叉搜索树(Binary Search Tree, BST),又称二叉排序树。它要么是一棵空树,要么满足以下性质:
- 若左子树不为空,则左子树上所有结点的值都小于等于根结点的值。
- 若右子树不为空,则右子树上所有结点的值都大于等于根结点的值。
- 左右子树本身也必须是二叉搜索树。
关于相等值的处理,具体取决于使用场景。例如 std::map/std::set 不支持插入相等值,而 multimap/multiset 支持。这完全由底层实现定义。
性能表现
由于中序遍历的结果一定是升序序列,BST 非常适合用于查找和排序。其时间复杂度高度依赖于树的形态:
- 最优情况:树接近完全二叉树,高度为 $\log_2 N$,操作效率为 $O(\log N)$。
- 最差情况:树退化为单支树(类似链表),高度为 $N$,操作效率降为 $O(N)$。
这种不稳定性促使我们引入平衡二叉搜索树(如 AVL 树、红黑树)。虽然二分查找也能达到 $O(\log N)$,但它要求数据存储在支持随机访问的有序结构中,且插入删除需要大量移动数据。相比之下,平衡二叉搜索树在动态增删改查方面更具优势。
基本结构实现
节点定义
为了方便访问成员,通常使用 struct 定义节点,默认公有权限。
template<class K>
struct BSTreeNode {
BSTreeNode* _left;
BSTreeNode* _right;
K _key;
BSTreeNode(const K& key)
: _left(nullptr), _right(nullptr), _key(key) {}
};
类框架与生命周期管理
树的操作涉及资源的申请与释放,因此必须正确实现拷贝构造、赋值重载和析构函数。这里采用私有辅助函数配合公有接口的方式来实现递归逻辑。
template<class K>
class BSTree {
typedef BSTreeNode<K> Node;
public:
// 默认构造
BSTree() = default;
// 拷贝构造
BSTree(const BSTree<K>& t) {
_root = Copy(t._root);
}
// 赋值重载
BSTree<K>& operator=( BSTree<K> t) {
(_root, t._root);
*;
}
~() {
(_root);
}
:
{
(root == ) ;
Node* copy = (root->_key);
copy->_left = (root->_left);
copy->_right = (root->_right);
copy;
}
{
(root == ) ;
(root->_left);
(root->_right);
root;
}
:
Node* _root = ;
};


