C++实现高效二叉搜索树

张开发
2026/4/21 21:13:15 15 分钟阅读

分享文章

C++实现高效二叉搜索树
二叉搜索树C实现二叉搜索树Binary Search Tree简称BST是一种常见的数据结构它基于二叉树的结构并满足特定排序性质。在BST中每个节点包含一个值且对于任意节点$n$其左子树中的所有节点值均小于$n$的值即$left n$。其右子树中的所有节点值均大于$n$的值即$right n$。这种性质使得BST在搜索、插入和删除操作中具有高效性平均时间复杂度为$O(\log n)$其中$n$为节点数。但最坏情况下如树退化为链表时间复杂度可能达到$O(n)$。下面我将逐步介绍基础概念、关键操作并给出完整的C代码实现。基础概念BST的核心是节点结构通常包含一个存储值的字段例如整数。指向左子树和右子树的指针。数学上BST的性质可以形式化为对于任意节点$v$设其左子树为$L$右子树为$R$则所有$l \in L$满足$l v$。所有$r \in R$满足$r v$。这确保了树的“有序性”允许我们使用二分查找策略进行高效操作。BST常用于实现字典、集合等抽象数据类型。关键操作BST支持三种基本操作搜索search、插入insert和删除delete。每个操作都基于递归或迭代方式实现利用BST的排序性质。搜索Search给定一个值$k$从根节点开始比较如果$k$等于当前节点值则找到。如果$k$小于当前节点值则递归搜索左子树。如果$k$大于当前节点值则递归搜索右子树。 时间复杂度平均为$O(\log n)$。插入Insert类似搜索但目的是找到合适位置插入新节点从根节点开始比较$k$与当前节点值。如果位置为空则创建新节点。否则递归到左或右子树。 插入后需保持BST性质。删除Delete这是最复杂的操作需处理三种情况无子节点直接删除。一个子节点用子节点替换。两个子节点找到右子树的最小值节点或左子树的最大值用其值替换当前节点然后删除该最小值节点。 数学上删除操作需保证树的性质不变 $$ \text{删除后BST性质仍成立} $$C代码实现下面是一个完整的C实现包括节点定义、BST类及主要方法搜索、插入、删除。代码使用递归实现简洁易理解。#include iostream using namespace std; // 定义BST节点结构 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; // BST类定义 class BinarySearchTree { private: TreeNode* root; // 辅助函数递归插入 TreeNode* insertNode(TreeNode* node, int val) { if (node nullptr) { return new TreeNode(val); // 创建新节点 } if (val node-val) { node-left insertNode(node-left, val); // 递归左子树 } else if (val node-val) { node-right insertNode(node-right, val); // 递归右子树 } return node; } // 辅助函数递归搜索 bool searchNode(TreeNode* node, int val) { if (node nullptr) { return false; // 未找到 } if (val node-val) { return true; // 找到 } else if (val node-val) { return searchNode(node-left, val); // 递归左子树 } else { return searchNode(node-right, val); // 递归右子树 } } // 辅助函数找到最小值节点用于删除操作 TreeNode* findMinNode(TreeNode* node) { while (node-left ! nullptr) { node node-left; } return node; } // 辅助函数递归删除 TreeNode* deleteNode(TreeNode* node, int val) { if (node nullptr) { return nullptr; // 节点不存在 } if (val node-val) { node-left deleteNode(node-left, val); // 递归左子树 } else if (val node-val) { node-right deleteNode(node-right, val); // 递归右子树 } else { // 情况1无子节点或一个子节点 if (node-left nullptr) { TreeNode* temp node-right; delete node; return temp; } else if (node-right nullptr) { TreeNode* temp node-left; delete node; return temp; } // 情况2两个子节点 TreeNode* temp findMinNode(node-right); // 找到右子树最小值节点 node-val temp-val; // 用最小值替换当前节点值 node-right deleteNode(node-right, temp-val); // 删除最小值节点 } return node; } public: BinarySearchTree() : root(nullptr) {} // 插入接口 void insert(int val) { root insertNode(root, val); } // 搜索接口 bool search(int val) { return searchNode(root, val); } // 删除接口 void remove(int val) { root deleteNode(root, val); } // 示例中序遍历验证BST有序性 void inorder(TreeNode* node) { if (node ! nullptr) { inorder(node-left); cout node-val ; inorder(node-right); } } void printInorder() { inorder(root); cout endl; } }; // 示例用法 int main() { BinarySearchTree bst; bst.insert(50); bst.insert(30); bst.insert(70); bst.insert(20); bst.insert(40); cout 中序遍历结果: ; bst.printInorder(); // 输出: 20 30 40 50 70 cout 搜索40: (bst.search(40) ? 存在 : 不存在) endl; // 存在 bst.remove(30); cout 删除30后中序遍历: ; bst.printInorder(); // 输出: 20 40 50 70 return 0; }时间复杂度分析搜索/插入/删除平均$O(\log n)$但最坏$O(n)$当树不平衡时。为了优化可考虑平衡BST如AVL树或红黑树但本实现专注于基础BST。BST是学习数据结构的核心内容理解其原理有助于深入算法设计。以上代码可直接编译运行例如使用g建议通过调试加深理解。

更多文章