По крайней мере, IMO, ваш print_out
на самом деле не работает так, как должен.Конкретная проблема заключается в том, что он пытается (напрямую) распечатать данные для дочерних узлов.
Когда вы имеете дело с двоичным деревом (любого вида - несбалансированным, AVL, RB и т. Д.), Обходобычно выглядит примерно так:
void print_out(node *current_node) {
if current_node != NIL {
show_data(current_node);
print_out(current_node->left);
print_out(current_node->right);
}
}
Как есть, это предварительный заказ;post-order или inorder - это просто вопрос перестановки print_data
по сравнению с рекурсивными вызовами на print_out
(для post-order он идет после них, для inorder между ними).
В частности, однакоprint_out не должен иметь что-либо , имеющее отношение к левому или правому поддереву, за исключением передачи их в качестве параметров в рекурсивном вызове.Он также обычно не должен проверять, являются ли они NIL / NULL, - он должен просто сделать рекурсивный вызов и позволить обработчику if (current_node != NIL)
в рекурсивном вызове иметь дело с возможностью того, что мы достигли конечного узла.
Называйте меня ленивым, если хотите, но это примерно столько, сколько я готов исследовать, по крайней мере, без некоторых указаний о том, какую проблему я ищу, и, по крайней мере, какразумная уверенность, что это правильное местоБыло бы полезно (например), если вы показали, что можете вставить несколько узлов и получить ожидаемую структуру, а затем показать , что идет не так, когда вы удаляете узел.Узел все еще там?Другие узлы теряются?Все ли узлы правильные, а баланс неправильный?Если так, что не так с балансом?