实现一个实用的 C++ 二叉搜索树
二叉搜索树(BST)的规则很简单:左子树所有节点值 ≤ 根值 ≤ 右子树所有节点值,子树也要满足。这导致中序遍历直接给出升序序列,所以它也叫二叉排序树。实际工作中,BST 的吸引力在于动态操作只需修改指针,不用整体搬移数据。但它的性能完全取决于树高——插入顺序糟糕时,树会退化成链表,查找从 O(log₂N) 跌到 O(N)。
对于相等值,常见做法有两种:直接拒绝(像 std::map 那样),或者全部甩到同一边。下面实现选择简单路线:不支持重复键。
插入、查找、删除:三个核心操作的实现
节点定义
先用模板包一层,让节点能存任意类型的键。
template<class K>
class BSTNode {
public:
BSTNode(const K& key = 0) : _key(key), _left(nullptr), _right(nullptr) {}
K _key;
BSTNode<K>* _left;
BSTNode<K>* _right;
};
插入
插入就是一路比较,找到空位挂上去。空树直接当根,非空时用 cur 探路,father 记前驱。如果值相等就宣告失败。
template<class K>
class BSTree {
public:
typedef BSTNode<K> Node;
bool Insert(const K& key) {
if (_root == nullptr) {
_root = new Node(key);
return true;
}
Node* cur = _root;
Node* father = nullptr;
while (cur) {
if (cur->_key > key) {
father = cur;
cur = cur->_left;
} else if (cur->_key < key) {
father = cur;
cur = cur->_right;
} {
;
}
}
cur = (key);
(key < father->_key) {
father->_left = cur;
} {
father->_right = cur;
}
;
}
{
_Print(_root);
cout << endl;
}
:
_Print( Node* root) {
(root == ) ;
_Print(root->_left);
cout << root->_key << ;
_Print(root->_right);
}
Node* _root = ;
};


