一、基本概念
二叉搜索树(Binary Search Tree, BST),又称二叉查找树或二叉排序树。它或者是一棵空树,或者是具有下列性质的二叉树:
- 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。
- 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。
- 它的左右子树也分别为二叉搜索树。
从定义可以看出,BST 的前提是二叉树,且采用了递归方式进行定义。节点间满足偏序关系:左子树根节点的值一定比父节点小,右子树根节点的值一定比父节点大。
构造这棵树的核心目的是提高搜索速度。如果对二叉搜索树进行中序遍历,得到的序列将是一个递增序列。
递归理解:
- 左右子树本身必须是二叉搜索树。无论从哪个节点开始,只需考察当前节点的值是否满足与左右子树的比较关系,然后递归判断子树性质。
- 以根节点为核心的分层定义,当前树的性质由根节点与左右子树的性质共同决定。这种嵌套结构直接体现了递归定义的存在。
二、类设计与内存管理
1. 节点结构体
template<class K>
struct BSTreeNode {
typedef BSTreeNode<K> Node;
Node* _left;
Node* _right;
K _key;
BSTreeNode(const K& key)
:_left(nullptr), _right(nullptr), _key(key) {}
};
注意 typedef 的使用,方便在内部引用自身类型。
2. 默认构造函数
BSTree() = default;
= default 的作用是显式告诉编译器生成默认构造函数。虽然编译器会自动生成,但如果你定义了其他构造函数(如拷贝构造),编译器将不再自动生成默认构造函数。使用 = default 既保持了代码简洁,又明确了语义:"这个类的默认构造行为是由编译器生成的,我没有进行额外的修改。"
3. 赋值运算符重载(Swap 惯用法)
现代 C++ 推荐通过 swap 实现赋值运算符,这种方式高效且安全。
BSTree<K>& operator=(const BSTree<K>& t) {
swap(_root, t._root);
return *this;
}
执行流程解析:
- 传值参数:函数签名
operator=(BSTree<K> t)会调用拷贝构造函数创建临时副本t。 - 交换指针:
swap(_root, t._root)交换了当前对象和临时对象的根指针。


