Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

МАксим Гогитидзе Ученик (90), закрыт 5 лет назад
Функции 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;
}
Лучший ответ
Dominik Torreto Ученик (149) 5 лет назад
Ты не тут спрашивай, а на спец форумах, тут аудитория ватных одноклассников врят ли тебе ответит
be toughМыслитель (5193) 5 лет назад
Чел, ты просто золото. Описал в точности как оно и есть.
Dominik Torreto Ученик (149) ?
Daniel BovetМыслитель (5194) 5 лет назад
Если бы в этой дырище хотя бы было форматирование кода, было бы не так уныло отвечать, а то напишешь красивый код, вставил - получил черт знает что. Я уже не говорю о том, что раздела C/C++ в принципе нет, только хреновеб.
...Гений (84839) 5 лет назад
Скорее глядя на эту простыню мало кто просто так захочет разбираться. Как и на любом другом форуме.
...Гений (84839) 5 лет назад
Даже файла нет. из которого чтение и его содержимого. Есс-но никто не ответит
Остальные ответы
Άηϑρέΰ ҂ Искусственный Интеллект (179765) 5 лет назад
разберись с моментом удаления узла.. возможно не правильно организовываешь его.. помог бы, да си терпеть не могу...
Lev Drakonov Мыслитель (5454) 5 лет назад
Здесь можешь узнать мнение участников ОК и не будет конечного результата-обратись лучше сразу к специалистам.
Антон ФАГ Мудрец (11274) 5 лет назад
А я спрашивал тебя суть задачи, но тебе похоже покер. Со stackoverflow обламалось пришел сюда.
Похожие вопросы