Как остановить рекурсию, предотвратив ее сворачивание

Рейтинг: 0Ответов: 1Опубликовано: 06.03.2023

Имеется класс для работы с бинарными деревьями. Мне нужно для каждого узла учитывать количество его потомков, соответственно чтобы поддерживать в каждом узле актульное количество, нужно правильно обработать это при добавлении и удалении узлов. Вот и возникла проблема при удалении узлов, ведь если попытаться удалить несуществующий элемент, нам не нужно менять количество потомков для всех узлов выше него.

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-- для каждого узла на этом пути, но это выглядит очень неоптимальным решением, учитывая возможные размеры деревьев.

Ответы

▲ 0

Был глупый вопрос. Добавил булевый операнд для проверки условия.

        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, ref bool notFound)
        {
            if (t == null)
            {
                notFound = true;
            }
            else
            {
                if ((t.inf).CompareTo(key) > 0)
                {
                    Delete(ref t.left, key, ref notFound);
                }
                else
                {
                    if ((t.inf).CompareTo(key) < 0)
                    {
                        Delete(ref t.right, key, ref notFound);
                    }
                    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;
                    }
                }
                if(!notFound)
                {
                    t.count--;
                }
            }
        }