【问题标题】:How to make a tree in C++?如何在 C++ 中制作一棵树?
【发布时间】:2010-09-06 08:38:12
【问题描述】:

如何在 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 的性能保证 算法和数据结构。 它们是否被实现为树 或者小绿人不重要 给你。

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

【问题讨论】:

    标签: c++ tree iterator


    【解决方案1】:

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

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

    附带说明一下,没有 root() 函数之类的东西。所有 STL 容器都有 begin() 函数实现容器的概念开始。该函数返回的迭代器类型取决于容器的特性。

    【讨论】:

      【解决方案2】:

      这里是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;
               }
            }
         }
      

      现在有什么不同?当涉及到时,您的实现更简单 将节点附加到树。 尽管您的版本非常简单,但此库的开发人员可能希望在不浏览树的情况下访问一些信息,例如树的大小。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-19
        • 2023-01-17
        • 1970-01-01
        • 2017-10-21
        • 2010-10-21
        • 2023-03-17
        • 2017-10-29
        • 1970-01-01
        相关资源
        最近更新 更多