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