二叉搜索树是由具有左子节点和右子节点的根节点组成的数据结构。左节点及其所有后代的值小于根节点,而右节点及其所有后代的值大于根节点。根节点的子节点遵循相同的模式。这给了我们一个由有序元素组成的树。
所以对于这个类,我必须写出函数,包括递归查找函数,插入函数和operator[]函数,这总体上有助于插入BST #包括 所以对于这个类,我必须写出函数,包括递归查找函数,插入函数和operator[]函数,这总体上有助于插入BST #include <compare> #include <cstddef> #include <format> #include <iostream> #include <string> #include <utility> template<typename Key, typename Value> struct BST { using KeyValue_Pair = std::pair<Key const, Value>; struct Node { Node() = default; Node( KeyValue_Pair const & pair ) : _pair{ pair } {} KeyValue_Pair _pair = { Key{}, Value{} }; Node * _left = nullptr; Node * _right = nullptr; Node * _parent = nullptr; }; Node * _root = nullptr; std::size_t _size = 0; Node * find( Key const & key ) { return find(key, _root); // Delegate the call to the private helper function } Node* find(Key const& key, Node* current) { // Base Case: Node not found if (current == nullptr) { return nullptr; } // Visit: Node found if (key == current->_pair.first) { return current; } // Recurse: Search left or right subtree if (key < current->_pair.first) { return find(key, current->_left); } else { return find(key, current->_right); } } Node * insert( KeyValue_Pair const & pair ) { Node * newNode = new Node( pair ); if(_root == nullptr){ _root = newNode; ++_size; return newNode; } Node * current = _root; Node * parent = nullptr; while(current != nullptr){ parent = current; auto comp = std::compare_weak_order_fallback( pair.first, current->_pair.first ); if( comp == 0 ) return current; else if(comp < 0 ) current = current->_left; current = current->_right; } auto comp = std::compare_weak_order_fallback( pair.first, current->_pair.first ); if( comp < 0 ) parent->_left = newNode; else parent->_right = newNode; newNode->_parent = parent; ++_size; return newNode; } Value & operator[]( Key const & key ) { return insert( { key, Value{} } )->_pair.second; } //everything under this comment already came with the code void print() { auto count = 0uz; print( _root, count ); } void print( Node * current, std::size_t & count ) // in-order traversal { // Base case if( current == nullptr ) return; // Recurse left print( current->_left, count ); // Visit auto && [key, value] = current->_pair; std::cout << std::format( "{:3}: {{{}, {}}}\n", ++count, key, value ); // Recurse right print( current->_right, count ); } ~BST() noexcept { clear(); } }; int main() { BST<unsigned int, std::string> myTree; std::cout << "Test Case 1:\n"; // 50 // myTree[50] = "indeed"; // / \ // myTree.insert( { 40, "Structures" } ); // 40 60 // myTree.insert( { 60, "very" } ); // / \ / \ // myTree.insert( { 30, "Lego" } ); // 30 45 55 70 // myTree.insert( { 45, "are" } ); myTree[55] = "truly"; myTree[70] = "entertaining"; myTree.print(); std::cout << "------------------------------\n"; } 但是,我收到测试用例 1 的分段错误(核心转储)错误消息。我不确定错误是否出现在递归查找或插入函数中。我非常感谢一些反馈,请并谢谢。如果代码太长,我也表示歉意,我想包含 main 中的测试用例 1,但我不确定是否应该包含 void print 函数。 您的 while 循环要么在找到匹配项时退出,要么在超出底部时退出——此时 current 为空。下一条语句取消引用 current。你可能指的是父母。这是您期望的输出吗: 1: {30, Lego} 2: {40, Structures} 3: {45, are} 4: {50, indeed} 5: {55, truly} 6: {60, very} 7: {70, entertaining} 这就是我进行两项更改时得到的结果: cout << "while....\n"; while(current != nullptr){ parent = current; auto comp = std::compare_weak_order_fallback( pair.first, current->_pair.first ); if( comp == 0 ) return current; else if(comp < 0 ) current = current->_left; else current = current->_right; } cout << "while done\n"; auto comp = std::compare_weak_order_fallback( pair.first, parent->_pair.first ); 请参阅 while 循环末尾的 else 子句(您刚刚设置了它)以及对 Parent 而不是 current 的取消引用。
我正在编写一个代码来返回任何节点的父节点,但我遇到了困难。我不想使用任何预定义的 ADT。 //假设节点由 1...n 中的数字表示,其中 1=root 甚至 ...
我正在编写一个BST程序。我收到错误: “二元运算符 "> 的错误操作数类型 第一种类型:java.lang.Object 第二种类型:java.lang.Object” 这就是它给我呃...
假设我必须通过合并两个 BST 来创建一个 BST,其中 T1 和 T2 都是 BST,这样 T1 的节点比 T2 更多,并且使用此算法,对于 T2 中的每个节点,从 T2 中删除节点并插入...
尾部嵌套调用的递归可以是尾递归吗? 例如,我在 Racket 中有以下函数,旨在转换二叉树,定义为嵌套结构...
通过选择中间元素将排序数组转换为高度平衡的二叉搜索树 - 为什么它有效?
我正在做一个练习,将排序数组转换为二叉搜索树,其中树中的每个节点都有其高度最多相差 1 的子节点。 一个简单的解决方案是挑选中间...
我正在尝试实现一个AVL树,我偶然发现了这个问题,如何在插入新节点时更新高度? 我知道我必须一直更新节点的高度。 对于
我最近开始研究红黑树的结构,正在努力确定它是否平衡。并解释为什么它仍然是平衡的,反之亦然。 ...
没有左子树且作为其父节点的左子节点的节点的中序前驱节点是否始终是其祖节点?
我试图理解在二叉搜索树(BST)中查找节点的中序前驱的规则。 如果节点 𝑥 有左子树,则中序前驱是 其中最大的价值...
在二叉搜索树(BST)中,我试图理解中序前驱的属性,特别是对于具有左子树的节点。 定义:节点的中序前驱是...
我正在尝试用数组构建二叉树。我想获取数组,找到根并分割左右两侧,然后根据需要在每一侧执行相同的分割,直到剩下两个数字...
对于任意总元素计数,AA 树如何在每个非叶节点始终有 2 个子节点?
我一直在阅读 AA 树。它们的不变量之一是每个非叶节点都有两个子节点。当元素总数不小于...的幂时,这如何工作?
对于我来说,为什么 CLRS 提供的从二叉搜索树中删除节点的算法(见下文)能够正常工作(就像我们如何知道节点的有序排列),这并不是很明显
给定一棵 BST 树,我们必须根据输入(N)将树分成两棵子树,其中 subtree1 由所有小于或等于 N 的节点组成,subtree2 由所有
我需要有关 test-dome 中发布的问题的解决方案。 这是问题 二叉搜索树(BST)是一棵二叉树,其中每个节点的值大于或等于所有节点中的值...
对于每个操作,平衡二叉搜索树会比平衡二叉树更快地完成任务吗? 寻找树中最小的项目。 我认为平衡 BST...
在 Arne Andersson 的原始论文“Balanced Search Trees Made Simple”中,第二章第一段在介绍
如何删除应用了边缘情况的树节点.. 尝试迭代节点的元素,其中如果它是根,则只需递归删除它,但如果我想删除......
我正在努力在java中实现BST(二叉搜索树),我正在寻找有关插入和删除节点的最佳实践,我了解插入和删除的基础知识,但我
二叉搜索树的删除方法删除所有节点而不是只删除选定的一个C++
我在取消二叉搜索树中的节点时遇到问题。我实现的消除树节点的方法会消除所有节点,我不明白为什么。 这是...