Top.Mail.Ru
Ответы

Бинарное дерево си

Функции next и prev выдают неправильные результаты (
next x — выведите минимальный элемент в дереве, строго больший x, или «none» если такого
нет
prev x — выведите максимальный элемент в дереве, строго меньший x, или «none» если такого
нет
Допустим я ввел дерево 2 5 3 у меня next 4 выводит none. prev 4 выводит 2. После удаления 5, выводит при next 4 none . При prev 4 выводит 3. Не понимаю в чем проблема, помогите!

Node* next(Node *root, T x) {
Node* current = root; Node* successor = NULL; // root — корень дерева
while (current != NULL)
if (current->data > x) {
successor = current;
current = current->left;
}
else
{
current = current->right;
return successor;
}
}
Node* prev(Node *root, T x) {
Node* current = root; Node* successor = NULL; // root — корень дерева
while (current != NULL)
if (current->data < x) {
successor = current;
current = current->right;
}
else
{
current = current->left;
return successor;
}
}

void printTree(Node *root, const char *dir, int level) {
if (root) {
printf("lvl %d %s = %d\n", level, dir, root->data);
printTree(root->left, "left", level + 1);
printTree(root->right, "right", level + 1);
}
}
void main() {
Node *root = NULL;
char str[10];
int c;
FILE *f;
f = fopen("sort.txt", "r");
FILE *f2;
f2 = fopen("sort2.txt", "w");
for (int i = 0; i < 10; i++)
{
fscanf(f, "%s", str);
fscanf(f, "%d", &c);
if (strcmp(str, "insert") == 0)
{
insert(&root, c);
}
else if (strcmp(str, "delete") == 0)
{
root = delete(root, c);
}
else if (strcmp(str, "exists") == 0)
{
fprintf(f2, "%s\n", getNodeByValue(root, c) ? "true" : "false");
}
else if (strcmp(str, "next") == 0)
{
Node* node = next(root, c);
if (node)
fprintf(f2, "%d\n", node->data);
else
fprintf(f2, "%s\n", "none");
}
else if (strcmp(str, "prev") == 0)
{
Node* node = prev(root, c);
if (node)
fprintf(f2, "%d\n", node->data);
else
fprintf(f2, "%s\n", "none");

}
else printf("ERROR");
printTree;

}

fclose(f);
fclose(f2);
printTree(root, "root", 0);
return 0;
}

По дате
По Рейтингу
Аватар пользователя
Новичок
6лет

Ты не тут спрашивай, а на спец форумах, тут аудитория ватных одноклассников врят ли тебе ответит

Аватар пользователя
Профи
6лет

Cos a +cosb = xz

Аватар пользователя
Мудрец
6лет

А я спрашивал тебя суть задачи, но тебе похоже покер. Со stackoverflow обламалось пришел сюда.

Аватар пользователя
Мыслитель
6лет

Здесь можешь узнать мнение участников ОК и не будет конечного результата-обратись лучше сразу к специалистам.

Аватар пользователя
Искусственный Интеллект
6лет

разберись с моментом удаления узла.. возможно не правильно организовываешь его.. помог бы, да си терпеть не могу...