Если вы хотите включить исходное значение узла в сумму, то это очень легко с рекурсией:
public void sumNode(TNode<E> root) {
// For empty trees, do nothing.
if (root == null)
return;
// Update the left subtree recursively.
sumNode(root.left);
// Update the right subtree recursively.
sumNode(root.right);
// At this point, all the elements in the left and right
// subtrees are already summed up. Now we update the
// sum in the root element itself.
if (root.left != null)
root.item += root.left.item;
if (root.right != null)
root.item += root.right.item;
}
Если вы не хотите включать исходное значение, то один рекурсивныйпрохода недостаточно, потому что к тому времени, когда вы вычисляете значение нелистового узла N с двумя листами L1 и L2, значения в L1 и L2 уже были обновлены до нулей, поэтому вы не можете использовать исходные значения L1 и L2для сохранения N. Если вам разрешено добавить новую запись originalItem
в узел, вы можете сохранить исходное значение там, использовать мое решение выше и затем выполнить последний проход, который вычитает значение originalItem
из item
для каждого узла в дереве:
private void preprocessTree(TNode<E> root) {
if (root == null)
return;
preprocessTree(root.left);
preprocessTree(root.right);
root.originalItem = root.item;
}
private void processTree(TNode<E> root) {
if (root == null)
return;
processTree(root.left);
processTree(root.right);
if (root.left != null)
root.item += root.left.item;
if (root.right != null)
root.item += root.right.item;
}
private void postprocessTree(TNode<E> root) {
if (root == null)
return;
postprocessTree(root.left);
postprocessTree(root.right);
root.item -= root.originalItem;
}
public void sumTree(TNode<E> root) {
preprocessTree(root);
processTree(root);
postprocessTree(root);
}