Вставить в дерево с нулевым элементом легко:
return tree_make(elt, tree_make(), tree_make());
Вставка в одноэлементное дерево также проста:
tree_t new_node = tree_make(elt, tree_make(), tree_make());
if(elt < tree_elt(tree))
return tree_make(tree_elt(tree), new_node, tree_right(tree));
else
return tree_make(tree_elt(tree), tree_left(tree), new_node);
Как правило, чтобы вставить новый элемент, вам необходимо воссоздать всех его родителей таким образом.
Часть 2: рекурсия
У нас есть базовый случай (дерево с нулевым элементом). И мы знаем, как прикрепить новое поддерево к корню нашего существующего дерева.
Так как получить новое поддерево? Ну, а как насчет того, чтобы просто вставить элемент в текущее поддерево?
Следующий код всегда будет прикреплять новый элемент в крайнем левом углу дерева, но исправлять его, как только вы его поймете, будет тривиально:
tree_t tree_insert(int elt, tree_t tree)
{
if(tree_empty(tree)) //base case
return tree_make(elt, tree_make(), tree_make());
else
return tree_make( // make a new node
tree_elt(tree) // with the same value as the current one
tree_insert(elt, tree_left(tree)) //insert into the left subtree
tree_right(tree) // keep the right subtree the same
);
}