在传递过程中,我问了许多关于树数据结构的问题,但似乎我没有在C ++中采用正确的方式。
在我编写数据结构的方式中,我无法想到如何使用“结束”或“开始”迭代器的单一方式。因此,我已经采用了将所有功能都包含在成员方法中的方法。而不是使用迭代器的标准方法&算法
现在我的树结构的目标是:1)尽可能快地将分支从一棵树移动到另一棵树。 2)每个分支应该是它自己的树。并且在树上执行的操作也应该能够在分支上执行。
我所做的只是创建一个包含向量的类。 - 向量内部是此类的其他对象。示例(我在这里只发布一个最小的例子,因为我现在面临的最大问题是该类太大而无法处理):
template <typename ValTy>
class Tree {
private:
std::vector<std::unique_ptr<Tree> > subtrees;
ValTy value;
};
正如你所看到的,我可以从subtrees
中取出一些东西 - 并将其用作树或复制它。
然而,由于顶级树没有关于有多少子树(或多少级别)的指示,因此不可能声明“结束迭代器”?像std :: find()这样的算法不会迭代整个树(以及它的所有子树)?
是否可以使用这些算法,同时仍然保持简单“分支”的结构?
答案 0 :(得分:1)
您可以通过保留一组子树向量的迭代器来迭代这样的树。这样一个向量的增量意味着在最顶层的子树迭代器上增加,如果最底部的迭代器在它的末尾则进行清理。
此向量的end()
迭代器只是空栈。
答案 1 :(得分:0)
正如你所看到的,我可以从树丛中取出一些东西 - 并将其用作树或复制它。然而作为顶部 级别树没有关于有多少子树(或多少个)的指示 等级),不可能说“结束迭代器”?并作为 像std :: find()这样的算法不会迭代整个树 (以及它的所有子树)?
这里的问题更多的是概念问题。
我总是使用递归解决树结构中的CRUD功能。递归不需要知道子树的数量,这是允许O(log n)
插入,查找和删除的事情之一。
插入示例:
void insertNode(Node* &treeNode, Node *newNode) {
if (treeNode) treeNode = newNode;
else if (newNode->key < treeNode->key) insertNode(treeNode->left, newNode);
else insertNode(treeNode->right, newNode);
}
如果您需要知道树上有多少级别,请将子项保留为NULL。您可以使用这些知识轻松计算O(log n)
算法,以计算树中儿童的数量。
树设计用于递归访问。如果你想要非递归访问,树木可能不是你想要的? - 这种结构将以什么样的访问频率保存?