创建树数据结构 - 不同的方法

时间:2012-01-17 14:16:48

标签: c++ tree-structure

在传递过程中,我问了许多关于树数据结构的问题,但似乎我没有在C ++中采用正确的方式。

在我编写数据结构的方式中,我无法想到如何使用“结束”或“开始”迭代器的单一方式。因此,我已经采用了将所有功能都包含在成员方法中的方法。而不是使用迭代器的标准方法&算法

现在我的树结构的目标是:1)尽可能快地将分支从一棵树移动到另一棵树。 2)每个分支应该是它自己的树。并且在树上执行的操作也应该能够在分支上执行。

我所做的只是创建一个包含向量的类。 - 向量内部是此类的其他对象。示例(我在这里只发布一个最小的例子,因为我现在面临的最大问题是该类太大而无法处理):

template <typename ValTy>
class Tree {
private:
    std::vector<std::unique_ptr<Tree> > subtrees;
    ValTy value;
};

正如你所看到的,我可以从subtrees中取出一些东西 - 并将其用作树或复制它。 然而,由于顶级树没有关于有多少子树(或多少级别)的指示,因此不可能声明“结束迭代器”?像std :: find()这样的算法不会迭代整个树(以及它的所有子树)?

是否可以使用这些算法,同时仍然保持简单“分支”的结构?

2 个答案:

答案 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)算法,以计算树中儿童的数量。


树设计用于递归访问。如果你想要非递归访问,树木可能不是你想要的? - 这种结构将以什么样的访问频率保存?