Ваш код нуждается в работе, но одна подсказка состоит в том, что если вы бросаете исключение, вы должны поймать его . В C ++ неясно определено, что происходит, когда исключение не перехватывается, и поэтому это может быть вашей проблемой.
Так, например,
if(root->father == nullptr)return findPerson(root->mother, child_name);
не проверяет, ОБА мать и отец нулевые. Если это так, он вызовет findPerson с nullptr. После этого функция сгенерирует throw.
Как подсказка, в системе linux лучший способ найти эти проблемы - использовать gdb. Команда «catch throw», за которой следуют «start» и «continue», перехватит любые сгенерированные исключения. «БТ» покажет вам, как вы туда попали. GDB - это (давайте посмотрим правде в глаза) ужасный откат, который непроницаем для большинства новичков, однако, как и vi, это хороший навык, чтобы знать хотя бы основы.
Краткое руководство по началу работы. https://beej.us/guide/bggdb/