如何用C ++创建一个树?

时间:2008-08-21 01:28:06

标签: c++ tree iterator

如何在C ++中创建使用迭代器而不是指针的树数据结构?我在STL中找不到可以做到这一点的任何东西。我想做的是能够像这样创建和操作树:

#include <iostream>
#include <tree>
using namespace std;

int main()
{
    tree<int> myTree;

    tree<int>::iterator i = myTree.root();
    *i = 42;

    tree<int>::iterator j = i.add_child();
    *j = 777;
    j = j.parent();

    if (i == myTree.root() && i == j) cout << "i and j are both pointing to the root\n";

    return 0;
}

谢谢,tree.hh似乎正是我想要的。

  

如果这是为了获得利益   保持任意的数据结构   索引类型,针对搜索进行了优化   并且善于插入然后考虑   使用地图。

     

地图是一个关联容器   性能保证相同   对于那些树:对数   搜索,对数插入,   对数删除,线性空间。   在内部,它们经常被实施   虽然是红黑树   不是保证。仍然,作为STL用户   所有你应该关心的是   STL的性能保证   算法和数据结构。   他们是否被实施为树木   或者小绿人应该不重要   给你。

我不确定地图是否是我需要的,但感谢您的信息。我会记得尽可能使用地图而不是实现树。

2 个答案:

答案 0 :(得分:5)

这是tree.hh,它有点接近你想做的事情,虽然有点 不同。

以下是从其网站上提取的一段代码。

int main(int, char **)
   {
   tree<string> tr;
   tree<string>::iterator top, one, two, loc, banana;

   top=tr.begin();
   one=tr.insert(top, "one");
   two=tr.append_child(one, "two");
   tr.append_child(two, "apple");
   banana=tr.append_child(two, "banana");
   tr.append_child(banana,"cherry");
   tr.append_child(two, "peach");
   tr.append_child(one,"three");

   loc=find(tr.begin(), tr.end(), "two");
   if(loc!=tr.end()) {
      tree<string>::sibling_iterator sib=tr.begin(loc);
      while(sib!=tr.end(loc)) {
         cout << (*sib) << endl;
         ++sib;
         }
      cout << endl;
      tree<string>::iterator sib2=tr.begin(loc);
      tree<string>::iterator end2=tr.end(loc);
      while(sib2!=end2) {
         for(int i=0; i<tr.depth(sib2)-2; ++i) 
            cout << " ";
         cout << (*sib2) << endl;
         ++sib2;
         }
      }
   }

现在有什么不同?在实施时,您的实施更简单 将节点附加到树。 虽然你的版本难以理解,但是这个lib的开发者可能想要在不浏览树的情况下访问一些信息,例如树的大小。

我还假设他不想出于性能原因将root存储在所有节点上。 所以如果你想按照自己的方式实现它,我建议你保留大部分逻辑,并在迭代器中添加父树的链接,并重写一点。

答案 1 :(得分:3)

你为什么要那样做?如果这是出于学习目的,那么您可以编写自己的树数据结构。如果这是为了获得保存任意索引类型的数据结构的好处,优化搜索和擅长插入,那么考虑使用映射。

映射是一个关联容器,其性能保证与树的性能保证相同:对数搜索,对数插入,对数删除,线性空间。在内部,它们通常被实施为红黑树,尽管这不是保证。尽管如此,作为STL用户,您应该关心的是STL算法和数据结构的性能保证。无论它们是以树木还是小绿人实施,都不应该对你有用。

作为旁注,没有root()函数。所有STL容器都有begin()函数,用于实现容器的概念性开头。该函数返回的迭代器类型取决于容器的特性。