二叉搜索树(Binary Search Tree,BST)作为一种经典的树形数据结构,凭借其高效的动态查找、插入和删除特性,在计算机科学领域有着广泛的应用。从底层实现来看,C++ 标准库中的 map、set、multimap、multiset 等关联式容器,其核心逻辑正是基于二叉搜索树(红黑树作为其平衡优化版本)构建。
相较于面向对象编程中的多态特性,二叉搜索树聚焦于数据的有序存储与高效检索,其核心价值在于利用'左子树值≤根节点值≤右子树值'的结构性约束,将查找、插入、删除操作的时间复杂度控制在近似 O(logN)(理想的平衡状态下)。而在最坏的单支树场景下,时间复杂度退化为 O(N),这也体现了数据结构设计中结构与性能的强关联性。
本文将从二叉搜索树的核心定义出发,逐步拆解节点设计、树的构建、插入、查找、删除等核心操作的实现逻辑,并区分仅存关键码与键值对两种典型应用场景,最终给出完整的可运行代码实现。
一、二叉搜索树的概念
二叉搜索树又称二叉排序树,满足以下核心特性:
- 左子树不为空,则左子树上所有节点的值都小于等于根节点的值
- 右子树不为空,则右子树上所有节点的值都大于等于根节点的值
- 左右子树也分别为二叉搜索树
二叉搜索树中可以支持插入相同的值,也可以不支持插入相等的值。其中 map、set 不支持插入相等值,multimap、multiset 支持插入相等的值。

二、二叉搜索树的性能分析
最好情况:树的结构接近完全二叉树,高度为 logN,此时查找、插入、删除操作的时间复杂度为 O(logN); 最坏情况:树退化为单支树,高度为 N,此时操作的时间复杂度退化为 O(N)。

三、二叉搜索树的整体框架
3.1 节点
二叉搜索树本质是由节点连接而成的链式结构,每个节点包含关键码、左孩子指针、右孩子指针,具体实现如下:
#pragma once
#include <iostream>
using namespace std;
// 二叉搜索树节点结构
template <class K>
struct BSTNode {
K _key; // 节点存储的关键码
BSTNode<K>* _left; // 左孩子节点指针
BSTNode<K>* _right; // 右孩子节点指针
( K& key) : _key(key), _left(), _right() {}
};

