Казалось бы, это просто школьный проект.
С чего начать.
1) Вы бьете влево / вправо по всему дереву. Я не уверен, почему вы ожидаете, что они будут сохранены, так как:
а) Вы всегда пишете в эти узлы.
б) Единственный раз, когда вы возвращаете существующий узел, находится на совпадении strcmp.
2) Вам действительно нужно проверить strcmp <0 при первом сравнении. </p>
3) Для несбалансированного дерева нет причин использовать рекурсию - вы можете просто использовать цикл, пока не доберетесь до листа, а затем зацепить лист. Если вы действительно хотите рекурсию ...
4) Рекурсивно ... Возвращать NULL во всех случаях, кроме случаев, когда вы создаете узел (то есть: первая часть, в которой у вас есть текущий == NULL).
5) Влево / вправо сохраните возвращаемое значение во временном локальном узле *. Только если возвращаемое значение не равно NULL, вы должны назначать влево / вправо.
Даже мне это не кажется правильным, но если бы я начал с нуля, это бы совсем не выглядело так. :) Мы даже не попадем в утечки / сбои памяти, с которыми вы, вероятно, столкнетесь, просто поместив значения 'char *' вокруг всех willy nilly.