【问题标题】:Implementing a tree in C++在 C++ 中实现树
【发布时间】:2010-09-10 16:53:41
【问题描述】:

我正在尝试为 C++ Linux 项目实现一个通用层次结构树。

不过,我还没有找到任何标准库树容器。

有吗?

提前致谢, 蒂姆

【问题讨论】:

标签: c++ linux


【解决方案1】:

这是一个使用 STL 容器创建分层树(没有特殊属性的 n 元)的简单方法。它不是预先构建的,但它非常简单,并且利用了一些 STL 属性。要创建自己的搜索,您必须实现自己的算法,但这应该很轻松。

template<typename T>
class TreeNode
{
public:
    TreeNode()
    {
    }

    TreeNode(const T& value)
        : Value(value)
    {
    }

    T Value;
    std::list<TreeNode<T> > Children;
};

【讨论】:

  • +1 但是,我的问题 (stackoverflow.com/questions/6517231/…) 的答案表明这不是合法的 C++。如果您可以在那里发布令人信服的答案,我一定会赞成并接受它。
  • @Bill:真的吗?臭死了。我相信在这种情况下,它可以通过pimpl 来缓解,但这会使它变得更脏并且不必要地变慢。我想你也总是可以使用链表。或者std::list&lt;TreeNode&lt;T&gt;*&gt; 怎么样?这听起来几乎是合法的。不过,这又是不必要的混乱。
  • 该死的,我真的希望你会说这是完全合法的。作为一个实用主义者,它确实工作,这对我来说意义重大。你说得对,ptr 版本是合法的,但它会带来多少额外的复杂性,这让我很恼火。
【解决方案2】:

STL set 和 map 在内部都使用二叉树

【讨论】:

    【解决方案3】:

    std:map 是使用树实现的,您可以利用它。这是我目前能想到的唯一“标准库树容器”。

    【讨论】:

      【解决方案4】:

      Boost 有一个 PropertyTree 容器,它可能是您正在寻找的。它基本上由存储一个值的节点和任意数量的子节点组成。 Boost 也非常接近标准。

      http://www.boost.org/doc/libs/1_44_0/doc/html/property_tree.html

      【讨论】:

        【解决方案5】:

        默认情况下没有 STL 类。您可以使用 STL 组件编写自己的树类,也可以尝试使用这个类似 STL 的树库:

        http://tree.phi-sci.com/

        【讨论】:

          【解决方案6】:

          没有可用于构建树结构的标准库容器。但是,如果您在理论上有足够的了解并且对编程语言(在您的情况下是 c++)没问题,那么创建通用树并不是一项艰巨的任务。

          首先创建通用(模板化)节点,为子节点添加两个指针(二叉树)或子节点指针列表(n-ary)。

          struct Node
          {
              int data;
              Node *left;
              Node *right;
          }
          

          给你。创建一个实例,您就有了根节点。创建更多节点并将它们作为子节点附加到根节点。重复同样的事情。和树一起玩很棒!

          您会在网上找到很多示例。有一个here 完全支持 Niki 的回答。

          【讨论】:

            【解决方案7】:

            这已经晚了,但可能会帮助某人。 nlohmann json 或一般的 json,可用于树数据结构

            https://github.com/nlohmann/json https://kezunlin.me/post/f3c3eb8/

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-04-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多