每隔一段时间,我都会遇到如下问题。 (这是用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进行编程并且必须自己弄弄内存,则前两个操作可能非常繁琐。最后一个绝对感觉像是黑客。
那么解决此问题的首选方法是什么?