【发布时间】:2011-07-06 23:56:24
【问题描述】:
感谢堆栈(带有推送和弹出),我在树中使用回溯算法。 它有效,但我有一个问题。堆栈给出的路径是“错误的”。
bool Prefix(Node*root, stack *tas, char *search)
{
if (!isEmpty(root))
{
if (strcmp(search,root->data) != 0)
push(tas, root->data, search, root);
if (strcmp(search,root->data) == 0)
{
return True ;
}
Prefix(root->left, tas, search);
Prefix(root->right, tas, search);
}
return False;
}
例如,我有一棵树:
Root
/ \
A B
/ \ / \
C D E F
例如,当我想要 C 的路径时,此函数返回 R A B(适用于 R 和 A,而不是 B)。
不知道是来自这个函数还是push()函数。 如果你在函数中没有看到任何错误,我会粘贴 push() 但它很长。
编辑:我现在更好理解了,
我已添加到函数中:
如果节点是叶子,pop()。
如果我搜索 F,它会返回 R A B F 而不是 R B F。我不知道如何避免将 A 保留在堆栈中。
编辑2:
这里是代码:(返回 R A B F 而不是 R B F)
bool Prefix(Node*root, stack *tas, char *search)
{
if (!isEmpty(root))
{
if (strcmp(search,root->data) == 0)
return True ;
if (LeafOrNot(root) == True ){ //it's a leaf, pop()
pop(tas);
if (Prefix(root->left, tas, search))
return True;
if (Prefix(root->right, tas, search))
return True;
}
return False;
}
我不明白如何弹出遍历子节点以获得好的结果,也许添加 if (Prefix(root->left, tas, search)) 的 else ?有人有想法吗?
谢谢!
【问题讨论】:
-
你快到了。如果您不仅在叶节点处而且在遍历任何子节点之后从堆栈中弹出,这将为您提供所需的结果。只要确保找到节点时不要从堆栈中弹出即可。如果您正在搜索 D,它将是 push Root、push A、push C、pop C、push D、found...展开调用链。如果您正在搜索 F:push Root、push A、push C、pop C、push D、pop D、pop A、push B、push E、pop E、push F、found、unwind... 希望这会有所帮助.
-
我尝试过另一个 pop(tas) 但它不起作用。我需要更改代码的结构吗?谢谢
标签: c tree stack backtracking