首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何表示这个“树”数据?

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

Stack Overflow用户
提问于 2010-03-02 19:19:34
回答 4查看 2.4K关注 0票数 1

我得到了一些数据(直到我解决了这个问题,这些数据才真正存在……)我需要能够在我的程序中进行操作。然而,我不能想出一个合适的结构来存储它。

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

我考虑使用树形结构,其中每个项目都有一个父项(根除外)和多个子项,例如:

代码语言:javascript
运行
复制
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

我将看一下图表。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-02 20:12:40

看起来你真的需要更多的自由结构而不是一棵树。每个节点可以有多个节点连接到它;每个连接有一个方向。任何节点都可以附加输入或输出。在创建和更新树时,不强制执行循环连接,并且只有一个输入由您决定。

这些结构可以是多重链表,如下所示:

代码语言:javascript
运行
复制
            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
            }

示例树:

代码语言:javascript
运行
复制
 INPUT
 |
 root
 |
 branch1---leaf2---output2
 |
 leaf1
 |
 output1

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

代码语言:javascript
运行
复制
            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 };
票数 2
EN

Stack Overflow用户

发布于 2010-03-02 19:29:32

您可以像这样创建一个类:

代码语言:javascript
运行
复制
enum NodeType
{ Node, Output };

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

NodeOutput类取自您的清单。不同之处在于Node类可以包含一系列TreeElement实例。此列表表示元素的子元素。

票数 0
EN

Stack Overflow用户

发布于 2010-03-02 19:42:08

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2362694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档