Из того, что я могу сказать из вашего вопроса, для каждого Node
вы хотите вычислить что-то о дереве, как если бы этот узел был листом.
Для этого нет никаких оснований фактически делать этоУзел лист, а затем снова прикрепить его.Вместо этого ваша логика может просто запомнить, какой узел обрабатывать как лист для каждого вычисления.
Обходить дерево, а для каждого Node
назовем его outerCurrentNode
, еще раз обойти дерево, выполняя ваш расчет- но теперь для каждого Node
, давайте назовем это innerCurrentNode
, проверим, если outerCurrentNode == innerCurrentNode
.Если тест возвращает true
, обработайте этот innerCurrentNode
как лист, игнорируя его дочерние элементы.
РЕДАКТИРОВАТЬ: Вот пример того, что я предлагаю (не проверено):
//entry point - called from directing code
public void iterativePreorder(Node root) {
iterativePreorderKernel(root, root);
}
//recursive method - keeps track of root in addition to current Node
private void iterativePreorderKernel(Node root, Node current) {
if (current.left() != null) {
iterativePreorderKernel(root, current.left());
}
if (current.right() != null) {
iterativePreorderKernel(root, current.right());
}
//for each Node in the tree, do calculations on the entire tree, pretending
//the current Node is a leaf
doCalculation(root, current);
}
//calculation method (also recursive) - takes a current Node, plus
//the Node to treat as a leaf
public void doCalculation(Node innerCurrent, Node pretendLeaf) {
//do calculation with inner current node
if (innerCurrent != pretendLeaf) {
if (innerCurrent.left() != null) {
doCalculation(innerCurrent.left(), pretendLeaf);
}
if (innerCurrent.right() != null) {
doCalculation(innerCurrent.right(), pretendLeaf);
}
}
}
Я использую рекурсию вместо Stack
, но любой из них будет работать.iterativePreorder()
выполняет обход, вызывая doCalculation()
для каждого Node
, передавая его вместе с корнем (для отслеживания всего дерева).Затем этот метод выполняет свой собственный обход, выполняя ваши вычисления, но останавливаясь на короткой позиции, когда достигает особо отмеченного Node
.