C++ 模拟实现二叉搜索树
二叉搜索树(Binary Search Tree,BST)是计算机科学中经典的树形结构,凭借高效的动态查找、插入和删除特性被广泛应用。从底层实现来看,C++ 标准库中的 map、set 等关联式容器,其核心逻辑正是基于二叉搜索树构建(红黑树是其平衡优化版本)。
它的核心价值在于利用'左子树值≤根节点值≤右子树值'的结构性约束,将操作的时间复杂度控制在近似 O(logN)(理想平衡状态下)。当然,最坏情况下退化为单支树时复杂度会变为 O(N),这也提醒我们在设计数据结构时需时刻关注结构与性能的平衡。
本文将拆解节点设计、树的构建、插入、查找、删除等核心操作的实现逻辑,并区分'仅存关键码(key)'与'键值对(key/value)'两种典型应用场景,最后给出完整的可运行代码。
一、二叉搜索树的概念
二叉搜索树又称二叉排序树,需满足以下核心特性:
- 若左子树不为空,则左子树上所有节点的值都小于等于根节点的值
- 若右子树不为空,则右子树上所有节点的值都大于等于根节点的值
- 左右子树也分别为二叉搜索树
二叉搜索树支持或不支持插入相同值的场景均有涉及。例如 map、set 不支持重复 key,而 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() {}
};

