Метод добавления элемента в дерево
Какой самый оптимальный вариант добавления элементов в бинарное дерево поиска на 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. Также буду рад любым другим хорошим примерам/фишкам, чтобы в них разобраться.