[BSTree] 二叉搜索树 -- C++ 模板实现

本文分享了一个使用C++模板实现的二叉搜索树代码,并对其内部构造进行了详细说明。作者通过此项目深入理解了C++模板编程,同时反思了C++编程语言的特点。

最近研究C++模板编程,参看了《STL源码剖析》之类的书,深深的感慨,模板这玩意真够神奇的。

实现了一个二叉搜索树的模板。但并不算完善,以后的编码多是一些算法的具体的实现。就模板技术来说,已搭建完毕。一瞬间失去了新鲜感,于是觉得没有再写下去的必要了。因相关算法在当年学习数据结构时候已实现过N次了……当年是用C来实现的,后来想尽办法想让我的程序更加的灵活更加的可复用,可惜当初有些抵触C++,没有想到有更好的办法。

以下是代码。

 

 

如果完全写完,到千行是轻易而举的事情。这也让我深深的体会到,用C++来写个什么东西总是很冗长,写久了就难免心生厌烦。大家都在努力的使语言更具有表现力,用更少的代码做更多的事情,不过我倒觉得,终极的改进方法应该是实现人机对话,这样什么什么都好解决了。

 

这次学到很多东西,也严重的看到了自己的不足。

<think>嗯,用户想要查找关于二叉搜索树C++实现代码示例。首先,我需要回忆一下二叉搜索树的基本概念和结构。根据引用[1],二叉搜索树(BST)是一种特殊的二叉树,每个节点的左子树所有节点的值都小于该节点,右子树则都大于。这在查找、插入和删除操作中非常高效。 接下来,用户需要具体的C++代码实现。查看引用[2]和引用[3],里面提到了BST的节点结构体和类的基本框架。节点结构体应该包含左右子节点指针和一个键值。然后,BSTree类需要包含插入、查找、删除等方法。不过用户可能还需要构造函数和析构函数,以及遍历方法,比如中序遍历来验证BST的正确性。 插入操作需要递归或迭代地找到合适的位置。根据引用[2],可能需要使用循环来比较键值大小,决定向左还是向右子树插入。查找操作类似,根据键值比较遍历树,直到找到目标或到达空节点。 删除操作比较复杂,需要考虑三种情况:被删除节点无子节点、有一个子节点、或有两个子节点。特别是当有两个子节点时,需要找到右子树的最小节点或左子树的最大节点来替换被删除节点,以保持BST的性质。 另外,用户可能希望看到完整的代码示例,包括测试用例。比如在main函数中插入一些节点,进行查找和删除操作,并用中序遍历输出结果,如引用[4]中的例子所示。同时,验证是否为BST的方法可以参考引用[5],虽然用户的问题中没有直接提到验证,但提供完整的实现可能包括这一点。 需要注意代码的正确性,比如析构函数要正确释放内存,防止内存泄漏。此外,模板的使用可以让BST支持不同的数据类型,但示例中可能简化使用int类型以便理解。确保代码注释清晰,结构符合C++最佳实践。 最后,生成相关问题时,要考虑用户可能进一步的需求,比如性能分析、优化方法或应用场景,这样能帮助用户更深入地理解BST的实现和应用。</think>### 二叉搜索树 C++ 实现代码示例 #### 1. 基础结构定义 根据引用[2],二叉搜索树的节点和类框架如下: ```cpp template<class K> struct BSTNode { BSTNode<K>* _left; BSTNode<K>* _right; K _key; BSTNode(const K& key) : _key(key), _left(nullptr), _right(nullptr) {} }; template<class K> class BSTree { typedef BSTNode<K> Node; public: BSTree() : _root(nullptr) {} ~BSTree() { Destroy(_root); } // 核心操作:插入、查找、删除、遍历 private: Node* _root = nullptr; }; ``` #### 2. 插入操作实现 根据引用[3]的搜索特性实现: ```cpp bool Insert(const K& key) { if (_root == nullptr) { _root = new Node(key); return true; } Node* cur = _root; Node* parent = nullptr; while (cur) { parent = cur; if (key < cur->_key) cur = cur->_left; else if (key > cur->_key) cur = cur->_right; else return false; // 不允许重复值 } Node* newNode = new Node(key); if (key < parent->_key) parent->_left = newNode; else parent->_right = newNode; return true; } ``` #### 3. 查找操作实现 ```cpp bool Find(const K& key) { Node* cur = _root; while (cur) { if (key == cur->_key) return true; else if (key < cur->_key) cur = cur->_left; else cur = cur->_right; } return false; } ``` #### 4. 删除操作实现 根据引用[2]的逻辑处理三种情况: ```cpp bool Erase(const K& key) { Node* parent = nullptr; Node* cur = _root; while (cur) { if (key < cur->_key) { parent = cur; cur = cur->_left; } else if (key > cur->_key) { parent = cur; cur = cur->_right; } else { // 找到目标节点 if (cur->_left == nullptr) { // 左子树空或叶子节点 if (parent == nullptr) _root = cur->_right; else if (parent->_left == cur) parent->_left = cur->_right; else parent->_right = cur->_right; delete cur; } else if (cur->_right == nullptr) { // 右子树空 if (parent == nullptr) _root = cur->_left; else if (parent->_left == cur) parent->_left = cur->_left; else parent->_right = cur->_left; delete cur; } else { // 左右子树均非空 Node* minParent = cur; Node* minRight = cur->_right; while (minRight->_left) { minParent = minRight; minRight = minRight->_left; } cur->_key = minRight->_key; if (minParent->_left == minRight) minParent->_left = minRight->_right; else minParent->_right = minRight->_right; delete minRight; } return true; } } return false; } ``` #### 5. 测试用例示例 ```cpp void InOrder(Node* root) { if (root == nullptr) return; InOrder(root->_left); std::cout << root->_key << " "; InOrder(root->_right); } int main() { BSTree<int> tree; tree.Insert(5); tree.Insert(3); tree.Insert(7); tree.Insert(1); tree.Insert(9); tree.Erase(3); InOrder(tree.GetRoot()); // 输出:1 5 7 9 return 0; } ``` #### 6. 引用验证 根据引用[5],二叉搜索树的合法性可通过中序遍历验证是否有序[^5]。上述测试用例的中序遍历结果符合升序特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值