Удаление элемента из бинарного дерева С++

Написал код удаление элемента из дерева, не понятно как передвигать элемент после удаление Код приведен ниже

Структура

#include <memory>

struct tree_node {
    int value;
    tree_node *up;
    std::unique_ptr<tree_node> left, right;
    tree_node(int val, tree_node *parent = nullptr) : value(val), up(parent) {}
};

struct tree {
    std::unique_ptr<tree_node> root;

    auto remove(int val) -> bool;
};

Сам код 
```auto tree::remove(int val) -> bool {
   
    auto uzel= std::ref(root);
    while (uzel.get() && uzel.get()->value != val)
        uzel= val < uzel.get()->value ? uzel.get()->left
                                             : uzel.get()->right;
    if (uzel.get() == nullptr)
        return false;
    else if (val < uzel.get()->value) {
        uzel.get->left = std::move(uzel.get()->left), val;
    } else if (val > uzel.get()->value) {
        uzel.get()->right = std::move(uzel.get()->right), val;
    } else if (uzel.get()->left && uzel.get()->right == nullptr) {
        uzel.get() = std::move(uzel.get()->up);
    } else {
        if (uzel.get()->left) {
            uzel.get()->left->up = uzel.get()->up;
            uzel.get() = std::move(uzel.get()->left);
        } else if (uzel.get()->right) {
            uzel.get()->right->up = uzel.get()->up;
            uzel.get() = std::move(uzel.get()->right);
        } else {
            uzel.get() = nullptr;
        }
    }
    
    return true;
}

Ответы (0 шт):