Метод добавления элемента в дерево

Какой самый оптимальный вариант добавления элементов в бинарное дерево поиска на c++? Есть два вот таких кода. Цикл:

void add_node(int value) {

    Node* rRoot = &this->root;

    Node* node = new Node;
    node->memory = value;
    node->left = NULL;
    node->right = NULL;

    while (true) {

        if (value < rRoot->memory) {
            if (rRoot->left == NULL) {
                rRoot->left = node;
                break;
            }
            else {
                rRoot = rRoot->left;
            }
        } else if (value > rRoot->memory) {
            if (rRoot->right == NULL) {
                rRoot->right = node;
                break;
            }
            else {
                rRoot = rRoot->right;
            }
        }
        else {
            break;
        }

    }
}

Рекурсия:

struct tnode * addnode(int x, tnode *tree) {
  if (tree == NULL) { // Если дерева нет, то формируем корень
    tree =new tnode; // память под узел
    tree->field = x;   // поле данных
    tree->left =  NULL;
    tree->right = NULL; // ветви инициализируем пустотой
  }else  if (x < tree->field)   // условие добавление левого потомка
    tree->left = addnode(x,tree->left);
  else    // условие добавление правого потомка
    tree->right = addnode(x,tree->right);
  return(tree);
}

И теперь хочу узнать, как лучше добавлять элементы? Рекурсией или циклом? Циклом я сделал также потому, что меня очень смущает постоянное ПЕРЕприсваивание результата функции:

tree->left = addnode(x,tree->left);

что, по сути, бесполезно (имеет смысл лишь в конце, когда дойдем до пустого узла).

P.S. Также буду рад любым другим хорошим примерам/фишкам, чтобы в них разобраться.


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