Элегантное рекурсивное решение (в псевдокоде):
def sum (node):
if node == NULL:
return 0
return node->value + sum (node->left) + sum (node->right)
тогда просто используйте:
total = sum (root)
Это правильно обрабатывает случай нулевого корневого узла.
И если вы хотите увидеть это в действии в C ++, вот код, использующий этот алгоритм. Во-первых, структура для узла и функция sum
:
#include <iostream>
typedef struct sNode {
int value;
struct sNode *left;
struct sNode *right;
} tNode;
int sum (tNode *node) {
if (node == 0) return 0;
return node->value + sum (node->left) + sum (node->right);
}
Тогда приведенный ниже код является тестовым кодом для вставки узлов:
static tNode *addNode (tNode *parent, char leftRight, int value) {
tNode *node = new tNode();
node->value = value;
node->left = 0;
node->right = 0;
if (parent != 0) {
if (leftRight == 'L') {
parent->left = node;
} else {
parent->right = node;
}
}
return node;
}
И, наконец, основная функция для построения следующего дерева, которое покрывает все допустимые возможности (пустой узел, узел с двумя дочерними элементами, узел без дочерних элементов, узел с одним правым дочерним элементом и узел с одним левым дочерним элементом) :
10
/ \
7 20
/ \
3 99
\
4
\
6
Код для построения этого дерева и представления суммы в различных точках показан здесь:
int main (void) {
// Empty tree first.
tNode *root = 0;
std::cout << sum (root) << '\n';
// Then a tree with single node (10).
root = addNode (0, ' ', 10);
std::cout << sum (root) << '\n';
// Then one with two subnodes (10, 7, 20).
addNode (root,'L',7);
addNode (root,'R',20);
std::cout << sum (root) << '\n';
// Then, finally, the full tree as per above.
addNode (root->left,'L',3);
addNode (root->left->left,'R',4);
addNode (root->left->left->right,'R',6);
addNode (root->right,'R',99);
std::cout << sum (root) << '\n';
return 0;
}
Это выводит (правильный):
0
10
37
149