Как остановить рекурсию, предотвратив ее сворачивание
Имеется класс для работы с бинарными деревьями. Мне нужно для каждого узла учитывать количество его потомков, соответственно чтобы поддерживать в каждом узле актульное количество, нужно правильно обработать это при добавлении и удалении узлов. Вот и возникла проблема при удалении узлов, ведь если попытаться удалить несуществующий элемент, нам не нужно менять количество потомков для всех узлов выше него.
private static void Del(Node t, ref Node tr)
{
if (tr.right != null)
{
Del(t, ref tr.right);
}
else
{
t.inf = tr.inf;
t.count--;
tr = tr.left;
}
}
public static void Delete(ref Node t, int key, out Node item)
{
if (t == null)
{
item = null;
}
else
{
if ((t.inf).CompareTo(key) > 0)
{
Delete(ref t.left, key, out item);
}
else
{
if ((t.inf).CompareTo(key) < 0)
{
Delete(ref t.right, key, out item);
}
else
{
if (t.left == null)
{
t.right.count = t.count;
t = t.right;
}
else
{
if (t.right == null)
{
t.left.count = t.count;
t = t.left;
}
else
{
Del(t, ref t.left);
}
}
item = t;
}
}
t.count--;
}
}
Как мне остановить рекурсию при t == null
, чтобы при сворачивании не выполнялся декремент count
?
У меня есть плохое решение, где я после удаления прохожу до места где был удаленный узел (как раз для этого в методе delete
выходной операнд item
) и делаю count--
для каждого узла на этом пути, но это выглядит очень неоптимальным решением, учитывая возможные размеры деревьев.