当您无法编辑节点结构时,将图节点标记为已访问的好方法吗?

时间:2019-04-07 17:55:45

标签: memory graph

每隔一段时间,我都会遇到如下问题。 (这是用C语言编写的,但是您可以想象此问题可能会以任何语言出现):

struct node {
    int value;
    struct node *left;
    struct node *right;
    struct node *up;
    struct node *down;
}

void visit(struct node *n);

void DFS_traverse(struct node *source) {
    if (source == NULL) return;

    visit(source);
    markAsVisited(source);

    if (isNotVisited(source->left)) {
        DFS_traverse(source->left);
    }

    //etc...
}

在此示例代码中,我们需要能够markAsVisited,并选中ifNotVisited。通常的方法是将结构修改为具有额外的成员:

struct node {
    int value;
    struct node *left;
    struct node *right;
    struct node *up;
    struct node *down;
    int visited;
}

并相应地旋转visited成员。

但是,如果您不能(或不应该)实际编辑所使用的结构(例如,它是在别人的代码中,或者您绝对需要此结构具有一定的大小),则此解决方案实际上是不可能的由于某些原因)。

以下是我想到的其他选项的列表:

  • 创建一个包装器结构,例如
struct wrapped_node {
    struct node *n;
    int visited;
}
  • 保留您遇到的所有指针的单独列表(为方便起见,您可以使用某种二进制搜索树或哈希表)

  • 如果您知道节点内的value仅可以采用某些值(例如,只能为正数),则可以将访问的信息压缩为其中的一位,然后在您执行后撤消该操作。搜索完毕。

所有这些解决方案都很难看。此外,如果您使用C进行编程并且必须自己弄弄内存,则前两个操作可能非常繁琐。最后一个绝对感觉像是黑客。

那么解决此问题的首选方法是什么?

0 个答案:

没有答案