Я пытаюсь решить следующие вопросы:
Разработать алгоритм и написать код, чтобы найти первого общего предка двух узлов в двоичном дереве.Избегайте хранения дополнительных узлов в структуре данных.ПРИМЕЧАНИЕ. Это не обязательно двоичное дерево поиска.
Я написал псевдокод для решения ниже.Основная идея, что левые и правые поддеревья общего предка должны содержать два значения:
Node ans;
//These are the target values/nodes (In case of values, I am assuming the are unique, no repeated values)
Value targetValue1,targetValue2;
Boolean checkExistance(Node n, Value v, Value q){
if n == null
return false;
elif n.value == v || n.value == q
return true;
checkLeft = checkExistance(n.left,targetValue1,targetValue1);
checkRight = checkExistance(n.right,targetValue1,targetValue1);
if checkLeft == checkRight == false
return false;
elif checkLeft == checkRight == true
ans = n;
thow new Excpetion("Common Ancestor was Found");
//it contains one of the node
return true;
}
Я полагаю, что исключение размотает стек и позволит избежать ненужных вызовов рекурсии.Мой вопрос - это хорошая практика, и есть ли шанс улучшить это решение, не используя неприятное исключение?