Как удалить путь в дереве, начиная с листа?

У меня есть объекты, организованные в виде дерева (не бинарного). Каждый узел имеет набор свойств Children и Parent. Все это уже представлено в TreeView. Я хотел бы щелкнуть лист и удалить его таким образом, чтобы лист удалялся, он поднимался к родителю, если лист был его единственным ребенком и если свойство родителя X == null - удалить его и снова идти вверх. Если нет - остановись. Не могли бы вы предложить решение этой проблемы? Я думаю, что здесь может быть полезна рекурсия, но я не знаю, как заставить ее работать правильно.


person Dawid    schedule 13.08.2014    source источник
comment
интересно, поделитесь кодом   -  person alessandro    schedule 13.08.2014


Ответы (2)


Это должно было быть комментарием, но все же... Я не знаком с TreeView, который вы используете, но почему бы вам не написать что-то вроде:

    void removeNode(Node node) {
            if (node != null && node.getChildren().size() == 0) {
                    Node parent = node.getParent();
                    if (parent != null && parent.getChildren().size() == 1) {
                            parent.getChilder().clear();
                            removeNode(parent);
                    }
            }
    }

Вы вызываете эти методы всякий раз, когда вы «щелкаете» (не уверен, как это выглядит в вашей программе) конечный узел.

person kt-9    schedule 13.08.2014

Похоже, я нашел решение. Раньше я думал, что сломал что-то с рекурсией, но проблема оказалась совсем крошечной.

Вот мое решение:

internal static void RemoveFromTree(ConfigurationItem item)
{
    NamedObject parent = item.Parent;

    if (parent is ConfigurationItem && parent.Children.Count == 1 && (parent as ConfigurationItem).ConfigId == null)
    {
        RemoveFromTree(parent as ConfigurationItem);
    }

    parent.Children.Remove(item);
    item.Parent = null;
}

NamedObject является общим предком ConfigurationItem и ConfigurationRoot.

person Dawid    schedule 13.08.2014