由于堆栈(带有推送和弹出),我在树中使用回溯算法。它有效,但我有一个问题。堆栈给出的路径是“错误的”。
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 的路径时,此函数返回 RAB(适用于 R 和 A,而不是 B)。
我不知道它是来自这个函数还是 push() 函数。如果您在函数中没有看到任何错误,我将粘贴 push() 但它很长。
编辑:我现在更好地理解了,我已经添加到函数中:
如果节点是叶子,pop()。如果我搜索 F,它会返回我 RABF 而不是 RB F。我不知道如何避免将 A 保留在堆栈中。
编辑2:
这是代码:(返回 RABF 而不是 RBF)
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 ?有人有想法吗?
谢谢 !