二叉搜索树是由具有左子节点和右子节点的根节点组成的数据结构。左节点及其所有后代的值小于根节点,而右节点及其所有后代的值大于根节点。根节点的子节点遵循相同的模式。这给了我们一个由有序元素组成的树。
网格行走算法: 您位于 N 维网格中的位置 (x_1,x_2,...,x_N)。网格的尺寸为 (D_1,D_2,...D_N)。一步一步,您可以在任一方向走在前面或后面...
我如何在 JavaScript 中编写一个函数来比较由 TreeNodes a 和 b 定义的两棵树?
我正在尝试编写一个 JavaScript 函数,该函数比较由 TreeNodes a 和 b 定义的两个二叉树,如果它们在结构和值上相等则返回 true,否则返回 false。 例如
BST 是根据集合 {1,2,3,4,5,6,7} 中键的每个排列生成的(通过连续插入节点)。有多少种排列决定高度为二的树? 我一直坚持这个简单的
我正在编写代码来返回任何节点的父节点,但我遇到了困难。我不想使用任何预定义的 ADT。 //假设节点由 1...n 中的数字表示,其中 1=root 甚至 ...
所以对于这个类,我必须写出函数,包括递归查找函数,插入函数和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...