У меня есть дерево элементов Манго, и для каждого элемента, который я хочу применить обработку, чтобы превратить их в Яблоки, как я могу написать метод (в Java будет приятно) который берет верхнюю часть элемента дерева манго и возвращает вершину яблок Дерево без рекурсии.Как построить дерево из дерева без рекурсии
С рекурсией у меня есть что-то вроде этого:
Apple transform(Mangoe ma){
//Construct an apple from some modified mangoes properties
Apple ap = new Apple(...);
List<Apple> apChildren = new ArrayList<Apple>();
for(Mangoe maChild:ma.getChildren())
children.add(transform(maChild));
ap.setChildren(children);
return ap;
}
Как я могу повторить это поведение с помощью метода без рекурсии ??
EDIT: я думал об этом алгоритме, чтобы решить эту проблему:
List<Mangoe> itemsToTreat = new ArrayList<Mangoe>();
itemsToTreat.add(ma);
while(itemsToTreat!=null){
//Apply treatment
//it's impossible to set the child of a created apple without recursion
//get the direct children of itemsToTreat
itemsToTreat = getDirectChildrenOfItemsToTreat(itemsToTreat);
}
В большинстве случаев вы можете заменить рекурсивные вызовы на циклы и некоторый стек, например. посмотрите [здесь] (https://blogs.msdn.microsoft.com/ericlippert/2005/08/01/recursion-part-two-unrolling-a-recursive-function-with-an-explicit-stack/) , В конце концов, вызовы рекурсивного метода делают то же самое: они просто добавляют другой вызов того же метода в стек вызовов, а также некоторую информацию о параметрах и т. Д. – Thomas
Я не уверен, что вы подразумеваете под рекурсией. Вы можете написать рекурсивный процесс как итеративный цикл с помощью структуры распределенной кучи, чтобы обрабатывать рекурсию, а не системный стек. Вы не можете сделать это без какого-либо рекурсивного процесса, так как это потребует, чтобы каждый узел дерева никогда не имел более одного ребенка, поэтому связанный список. – Sylwester
Если вы используете структуру 'Tree', я боюсь, вам придется использовать рекурсию, скрытую или явно. Например, если вы используете 'TreeSet', вы можете получить его итератор и пройти через все элементы с помощью цикла while. Однако внутри итератора будут несколько рекурсивных вызовов метода 'TreeMap.successor (Entry t)' –