一、概念
二叉搜索树,也叫二叉查找树或二叉排序树。它要么是一棵空树,要么满足以下性质:
- 若左子树不为空,则左子树上所有节点的值都小于根节点的值。
- 若右子树不为空,则右子树上所有节点的值都大于根节点的值。
- 左右子树也分别为二叉搜索树。
从定义可以看出,它的前提是二叉树,并且采用了递归方式定义。节点间满足偏序关系:左子树根结点的值一定比父结点小,右子树根结点的值一定比父结点大。构造这棵树的核心目的是提高搜索速度。如果对二叉搜索树进行中序遍历,得到的序列是一个递增序列。
递归理解:左右子树本身必须是二叉搜索树。无论从哪个节点开始,只需考察当前节点的值是否满足与左右子树的比较关系,然后递归到左右子树去判断它们是否分别满足性质。这种对左右子树重复性质的要求,正是递归定义的直接体现。
二、定义与核心机制
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 的写法,方便后续内部使用 Node 代替冗长的类型名。
2. 类定义与默认构造
template<class K>
class BSTree {
typedef BSTreeNode<K> Node;
public:
// 显式生成默认构造函数
BSTree() = default;
// 拷贝构造
BSTree(const BSTree<K>& t) {
_root = Copy(t._root);
}
private:
Node* _root = nullptr;
// 深拷贝辅助函数
Node* Copy(Node* root) {
if (root == nullptr) return ;
Node* newRoot = (root->_key);
newRoot->_left = (root->_left);
newRoot->_right = (root->_right);
newRoot;
}
};


