Я использую алгоритм возврата в дереве благодаря стеку (с push и pop).Это работает, но у меня есть проблема.Путь, заданный стеком, является «неправильным».
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 (), но она довольно длинная.
Редактировать: Теперь я лучше понимаю, я добавил в функцию:
если узеллист, поп ().Если я ищу F, он возвращает мне RABF вместо RB F. Я не знаю, как избежать сохранения A в стеке.
edit2:
Вот код: (возвращает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 (Префикс (root-> left, tas, search)))У кого-нибудь есть идеи?
спасибо!