Добавить функцию поиска элемента по значению в древе и удаление его с последующим сдвигом древа

plzvtl

, ясно. Кажется, понял Ваш подход.

Я допустил ошибку в сигнатуре функций при их рекурсивном вызове. Дерево разворачивается от одного узла, значит последующие вызовы функции должны быть (значит с else if сглупил я), т.к. оно разворачивается от одного узла, то в MenuProc() один узел и должен быть (вторая моя ошибка). У Вас в структуре были два поля под два узла (дерево бинарное), я же умышленно от них ухожу в самой структуре, но без них бинарного дерева не сделать, значит их надо поместить в аргументы функций. Тогда получается так

C++Выделить код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

struct BinTree {
    int value; 
};
 
void newBinTree(int val, BinTree tree, BinTree left = NULL, BinTree right = NULL) {
    if (tree == NULL)
    {
        tree = new BinTree; 
        tree->value = val;  
        return;
    }
    if (val > tree->value) newBinTree(val, &right);
    else newBinTree(val, &left);
}
 
void MenuProc() {
    BinTree Tree = NULL;
    newBinTree(val, &Tree)
}

Но в таком случае либо такую сигнатуру попросту не пропустит компилятор (указатели создаются по умолчанию, а указатель вроде как по смыслу с оригиналом должен быть связан, но оригинала в MenuProc() нет), либо все-таки что-то там создастся (не знаю уж как), но после схлапывания функции (отработки return) всё дерево и развалится до одного узла (который в MenuProc() находится), значение которого прописали в if. То есть мой подход не катит. А вот если это всё в структуре прописать, то оно судя по всему глобально висит, только до конца не осознал, что произойдет если сделать не указатели на саму структуру, а элементы этой структуры (указатели не просто же так сделаны). В MenuProc() однозначно нужен указатель на структуру, так как надо показать корень через nullptr. Тогда функция должна принимать указатель, т.е. nullptr этот. А с таким я никогда не сталкивался, значит аргумент функции, принимающий указатель из мейна пишется как

C++Выделить код

1
2
3
4
5
6
7
8

int foo(int ptr_to_ptr) {}
 
int main(){  
    int ptr = nullptr;
    foo(ptr);
 
    return 0;
}

Добавлено через 11 минут

хотя нет, всё правильно, там при nullptr в любом случае return отработает, рекурсия начинается при следующем вызове newBinTree(...) из MenuProc() и тогда else if нужен. С другой стороны насколько грамотно писать return если функция void?

Добавлено через 41 минуту

тоже ересь прописал, оператор new возвращает же указатель на кучу. Понятно всё - дерево в куче, указатели в структуре для рекурсии.

plzvtl

, очень круто функцию написали, я б дня 3 такое бы писал если не дольше. Один только вопрос остался - насколько грамотно писать return в функции void ?