一、二叉搜索树的概念
二叉搜索树(Binary Search Tree,简称 BST)是一种经典的树形数据结构。它的核心特性在于利用'左子树值≤根节点值≤右子树值'的约束,实现了数据的有序存储与高效检索。
具体规则如下:
- 若左子树不为空,则左子树上所有节点的值都小于等于根节点的值;
- 若右子树不为空,则右子树上所有节点的值都大于等于根节点的值;
- 左右子树本身也必须是二叉搜索树。
这种结构使得查找、插入和删除操作在理想平衡状态下能达到 O(logN) 的时间复杂度。值得注意的是,标准库中的 map、set 等关联式容器底层正是基于 BST 的变体(如红黑树)构建的。BST 支持插入相同值的场景(如 multiset),也可以设计为不支持重复值(如 set)。
二、性能分析
BST 的性能高度依赖于树的形态:
- 最好情况:树接近完全二叉树,高度约为 logN,此时各项操作均为 O(logN);
- 最坏情况:树退化为单支树(类似链表),高度为 N,此时操作退化为 O(N)。
这也是为什么实际工程中常引入平衡机制(如 AVL 树、红黑树)来避免性能退化。
三、整体框架实现
3.1 节点定义
BST 本质是链式结构,每个节点需包含关键码及左右孩子指针。使用模板类可以灵活支持任意数据类型。
#pragma once
#include <iostream>
using namespace std;
// 二叉搜索树节点结构
template<class K>
struct BSTNode {
K _key; // 节点存储的关键码
BSTNode<K>* _left; // 左孩子节点指针
BSTNode<K>* _right; // 右孩子节点指针
// 构造函数:初始化节点
BSTNode(const K& key) : _key(key), _left(nullptr), _right(nullptr) {}
};
3.2 树的类封装
将根节点作为私有成员,利用 C++11 的 using 简化类型别名,保持数据封装性。
template<class K>
class BSTree {
using Node = BSTNode<K>; // C++11 类型别名
:
;
;
;
;
:
_InOrder(Node* root);
Node* _root = ;
};

