У меня была проблема, которую я попытался решить. Задача потребовала найти максимальную высоту в одном направлении бинарного дерева. НАПРИМЕР. если ветка продолжается влево, то высота продолжает увеличиваться, но если ветка затем вернется, высота будет сброшена на 1.Решение для двоичного дерева Макс. Высота в одном направлении
В C# я нашел следующее: я даже не уверен, верный.
Кто-нибудь знает оптимальное решение?
class MaxHeightInOneDirection
{
public void Run()
{
Tree a = new Tree();
a.x= 20;
Tree b = new Tree();
b.x = 21;
Tree c = new Tree();
c.x = 12;
c.l = b;
c.r = a;
Tree d = new Tree();
d.x = 10;
d.l = c;
Tree e = new Tree();
e.x = 3;
Tree f = new Tree();
f.x = 5;
f.l = e;
f.r = d;
int maxHeight = GetHeight(f)[2];
}
public int[] GetHeight(Tree root)
{
if (root == null)
return new int[]{-1,-1, 0};
int[] leftResult = GetHeight(root.l);
int[] rightResult = GetHeight(root.r);
// Increase left on current left
leftResult[0]++;
// Set right result on current left to 0
leftResult[1] = 0;
// Set left result on current right to 0
rightResult[0] = 0;
// Increase right on current right
rightResult[1]++;
int leftMaxSoFar = leftResult[2];
int rightMaxSoFar = rightResult[2];
int maxValueSoFar = Math.Max(leftMaxSoFar, leftResult[0]);
maxValueSoFar = Math.Max(maxValueSoFar, rightResult[1]);
maxValueSoFar = Math.Max(maxValueSoFar, rightMaxSoFar);
return new int[] { leftResult[0], rightResult[1], maxValueSoFar };
}
}
В чем проблема? Что пошло не так? Используйте отладчик. установить контрольные точки. Следите за своими переменными. Сравните ожидаемые значения с фактическими значениями. – DrKoch
Для чего стоит, с первого взгляда, я думаю, что ваш алгоритм правильный и что вы не можете его оптимизировать, хотя я думаю, что задания 'xResult [1] = 0;' в лучшем случае не нужны и в худшем случае запутывают. – Rawling
DrKoch - Нет ничего неправильного в решении, насколько я знаю; Я просто ищу более аккуратное решение, если оно существует. – ahallan