如何表示这个“树”数据?

时间:2010-03-02 11:19:34

标签: c++ data-structures

我有一些数据(并不是数据实际存在,直到我解决了这个...)我需要能够在我的程序中操作。但是我无法找到一个合适的结构来存储它。

数据表示一组路径和节点。有一个输入(在某些情况下可能不存在)然后节点之间的多个路径以输出结束(一端可能没有输出,但输出总是在结尾)。每个输入,节点和输出都有一个位置,整个数据可以用图形方式操作,所以我使用的任何结构都需要很容易以潜在的不可预测的方式改变运行时的内容(例如将输入更改为输出,以及然后输入另一个输出)。

我考虑使用树结构,其中每个项目都有父项(除了root)和一些子项,例如:

Input
|
node---
|  |  |
|  |  Output
|  |
|  Node---Output
|  |---Output
|
Node----Node
|        |
Node     Output    

但是我可以看到一些问题,例如没有输入,或者删除/更改/等等......

这是一个直观的例子。 >是输入O节点和[]输出 http://unisonmodules.co.uk/wjnewbery/data.png

@Everyone建议使用像我已经提到的树结构

如果树实际上是合适的,我如何克服给定数据集甚至没有输入/根的问题,如下面所示。那么会发生什么?如果输入节点/点/任何更改(通过删除然后添加),我是否需要完全重建树?我该怎么做?

http://unisonmodules.co.uk/wjnewbery/data2.png

我会看看图表。

4 个答案:

答案 0 :(得分:2)

似乎你真的需要比树更多的自由形式结构。 每个节点可以连接多个节点;每个连接都有一个方向。任何节点都可以附加输入或输出。在树创建和更新时,不会强制执行循环连接,只有一个输入。

结构可以是多重链接列表,如下所示:

            struct Node {
              NodeContentType type;  //Input, Output, None.
              InOutNode* content;    //pointer to input or output
              Link* links;           //pointer to first connection (if any), NULL if none.
            }

            struct Link {
              Node* node;  //node this connection links to.
              Link* next;  //pointer to next connection
            }

示例树:

 INPUT
 |
 root
 |
 branch1---leaf2---output2
 |
 leaf1
 |
 output1

可能是这样的:(顺序显然是错误的......)

            Node root    = { Input, &input_function, &link1 };
            Link link1   = { &branch1, NULL };
            Node branch1 = { None,  NULL, &link2 };
            Link link2   = { &leaf1, &link3 };
            Link link3   = { &leaf2, NULL };
            Node leaf1   = { Output, &output_function1, NULL };
            Node leaf2   = { Output, &output_function2, NULL };

答案 1 :(得分:0)

你可以创建一个这样的类:

enum NodeType
{ Node, Output };

class TreeElement
{
  NodeType myType;
  union
  {
    Node myNode;
    Output myOutput;
  } NodeVariant;
};

NodeOutput类来自您的商家信息。不同之处在于Node类可以包含TreeElement个实例的列表。此列表表示元素的子元素。

答案 2 :(得分:0)

Composite pattern在这里可能非常有用。您可以将节点实现为一种容器,它再次保存输出或节点对象。在链接中,您将看到更多代码片段作为实现提示。

答案 3 :(得分:0)

创建一个具有值和兄弟数组的Node类。兄弟姐妹的数组可能是空的,在这种情况下它是一个值节点。该值可以为null,在这种情况下,它是一个联合。

相关问题