草庐IT

二叉树

全部标签

c++ - 使用 C++ 11 在二叉树(或任意树)上实现迭代器

我想在二叉树上创建一个迭代器,以便能够使用基于范围的for循环。我知道我应该首先实现begin()和end()函数。开始应该指向根。然而,根据规范,end()函数返回“最后一个有效元素之后的元素”。那是哪个元素(节点)?指向一些“无效”的地方不是违法的吗?另一件事是运算符++。返回树中“下一个”元素的最佳方法是什么?我只需要一些建议来开始这个编程。我想扩展/扩充我的问题*。如果我想遍历具有任意数量的树怎么办?让每个节点都有一个子vector,让begin()指向“真正的”根。我可能必须在迭代器类中实现一个队列(广度优先)来将unique_ptr存储到节点,对吗?然后,当队列为空时,我会

c++ - 二叉树的层序遍历

voidtraverse(Node*root){queueq;Node*temp_node=root;while(temp_node){coutvalueleft)q.push(temp_node->left);if(temp_node->right)q.push(temp_node->right);if(!q.empty()){temp_node=q.front();q.pop();}elsetemp_node=NULL;}}上面贴出的代码是我的关卡遍历代码。这段代码对我来说工作正常,但我不喜欢的一件事是我显式初始化temp_node=NULL或者我使用break。但它对我来说似乎不

c++ - 使用 C++ 以漂亮的方式打印二叉树

尝试在C++中打印如下所示的二叉树时,我有点迷茫:8/\/\/\510/\/\26911我知道如何获取树的高度和每一层的节点数,但我无法弄清楚如何在根和第二层之间设置正确的空格数(下面有3行)3层的根,但我相信不是每次都这样,我认为它可能是大树高度的3倍)。我想得到一些帮助来打印行中的这些空格以及行之间的行数。谢谢。我在用c++写代码Getheightinttree::getHeight(No*node){if(node==NULL)return0;return1+max(getHeight(node->esq),getHeight(node->dir));}Getnumberofno

c++ - C++ 游戏的四叉树与红黑树?

多年来,我一直在网上寻找四叉树/四叉树节点实现。有一些基本的东西,但我无法真正将其用作游戏。我的目的是在游戏中存储对象以处理诸如碰撞检测之类的事情。我不是100%确定四叉树是最好的数据结构,但根据我的阅读,它是。我已经编写了红黑树代码,但我真的不知道性能是否足以满足我的游戏(这将是像Ankh这样的冒险第三人称游戏)。我如何用C++编写一个基本但完整的四叉树类(或八叉树)?您将如何使用四叉树进行碰撞? 最佳答案 当您只需要存储在平面上有效的东西时,可以使用四叉树。就像经典RTS中的单位一样,它们都在地面上或略高于地面。基本上每个节点都

c++ - 二叉树插入算法

我最近为我正在从事的项目完成了二叉搜索树的实现。一切顺利,我学到了很多东西。但是,现在我需要实现一个常规的二叉树...出于某种原因,这让我感到难过。我正在寻找一种方法来执行我的InsertNode函数..通常在BST中,您只需检查data谁能帮我实现一个函数,它只是从左到右不按特定顺序向二叉树中添加一个新节点?这是我的BST插入内容:voidInsert(Node*&root,intdata){if(root==nullptr){Node*NN=newNode;root=NN;}else{if(datadata){Insert(root->left,data);}else{Insert

c++ - 二叉搜索树析构函数

致力于在C++中实现我自己的BST,以获得处理此类结构的经验。我在实现析构函数时遇到了问题。我在我的研究中发现,一个人不能真正拥有递归析构函数(由于一个标志不允许在被调用后对同一个对象调用析构函数),但我真的不确定任何成功清理树中所有节点的其他方法。作为补偿,我创建了一个辅助函数——但是这会在“deleten”行上抛出一个Unresolvedexternal错误。有什么建议吗?代码:voidBinSearchTree::Clear(tNode*n){if(n->left!=NULL)Clear(n->left);if(n->right!=NULL)Clear(n->right);del

c++ - 为 C++ 二叉搜索树使用智能指针

我已经用C++实现了二叉搜索树。我没有使用裸指针指向子节点,而是使用了std::shared_ptr.树的节点实现如下structtreeNode;typedefstd::shared_ptrpTreeNode;structtreeNode{Tkey;pTreeNodeleft;pTreeNoderight;treeNode(Tkey):key(key),left(nullptr),right(nullptr){}};从BST中删除一个节点时,其中一种情况是该节点只有一个child。节点简单地被这个child替换,如下所示:|removenodenode--------->|\righ

c++ - 从中序遍历打印所有二叉树

在一次采访中遇到了这个问题。给定二叉树的中序遍历。从中打印出所有可能的二叉树。最初的想法:如果说我们在数组中只有2个元素。说2,1。那么两种可能的树是2\11/2如果有3个元素,比如2,1,4。然后我们有5棵可能的树。21424\/\/\/124142\//\4211所以,基本上如果我们有n个元素,那么我们就有n-1个分支(childs,/或)。我们可以按任意顺序排列这n-1个分支。对于n=3,n-1=2。因此,我们有2个分支。我们可以这样安排2个分支:/\\//\/\/\初步尝试:structnode*findTree(int*A,intl,inth){node*root=NULL;

c++ - 二叉搜索树中的有序遍历复杂性(使用迭代器)?

相关问题:TimeComplexityofInOrderTreeTraversalofBinaryTreeO(N)?,但是它基于递归遍历(因此在O(logN)空间中),而迭代器只允许消耗O(1)空间。在C++中,通常要求递增标准容器的迭代器是O(1)操作。对于大多数容器来说,它的证明是微不足道的,但是对于map等,它似乎有点困难。如果将map实现为skip-list,那么结果将是显而易见的然而,它们通常被实现为红黑树(或至少作为二叉搜索树)因此,在有序遍历期间,有时“下一个”值不是那么容易达到。例如,如果您指向左子树的右下角叶子,那么下一个要遍历的节点就是根,距离depth步远。我已经

php - 使用 PHP + MySQL 的二叉树

我正在使用PHP(CodeIgniter)和MySQL为网站实现MLM树。我需要在数据库中实现二叉树。需要考虑以下几点:对于每个节点,左子树中的child/节点数与右子树中的child/节点数中的最小者称为一对。对于每一对,一个节点获得1分-应该存储在数据库中(节点代表用户)当创建一个新节点时(无论在何处),许多节点对可能会递增。因此,无论何时创建节点,都应更新每个节点的点(适用时加一)另一个限制是每天任何节点不能超过100个点。我还需要构建(在网页中显示)树。只显示4-5个级别。数据库大概有100000个节点我发现主要有4种在MySQL、PHP中实现分层数据的模型邻接表路径枚举嵌套集