#include <cstdio> #include <climits> #include <cassert> #include <iostream> #include <algorithm> #include <string> struct Node { int value = 0; struct Node *left = nullptr; struct Node *right = nullptr; }; void preorder_print_aux(Node *T) { if (T == nullptr) { return ; } std::cout << T->value << ' '; preorder_print_aux(T->left); preorder_print_aux(T->right); } void preorder_print(Node *T) { preorder_print_aux(T); std::cout << std::endl; } Node *CreateBiTreeAux(Node *&T, std::vector<int>::const_iterator &ite) { // 按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树, // 构造二叉链表表示的二叉树T。 int elem = *ite++; if (elem == INT_MIN) { T = nullptr; } else { T = new Node; T->value = elem; // 生成根结点 CreateBiTreeAux(T->left, ite); // 构造左子树 CreateBiTreeAux(T->right, ite); // 构造右子树 } return T; } Node *create_tree(Node *&T, const std::vector<int> &input) { std::vector<int>::const_iterator ite = input.begin(); CreateBiTreeAux(T, ite); return T; } void free(Node *&T) { if (T == nullptr) return; free(T->left); free(T->right); delete T; T = nullptr; } int sum(struct Node *tree, int *max_sum) { if (tree->left == nullptr && tree->right == nullptr) { *max_sum = tree->value; return tree->value; } int left_sum = INT_MIN; int l_max_sum = INT_MIN; if (nullptr != tree->left) { left_sum = sum(tree->left, &l_max_sum); } int right_sum = INT_MIN; int r_max_sum = INT_MIN; if (nullptr != tree->right) { right_sum = sum(tree->right, &r_max_sum); } int ret = tree->value + left_sum + right_sum; if (ret < l_max_sum) { ret = l_max_sum; } if (ret < r_max_sum) { ret = r_max_sum; } *max_sum = ret; return ret; } void assert_equal(int expect, std::vector<int> tree) { Node *T = nullptr; create_tree(T, tree); preorder_print(T); int ret = 0; sum(T, &ret); if (expect != ret) { fprintf(stderr, "Expect %d, but result is %d. ", expect, ret); exit(1); } free(T); } int main() { assert_equal(3, {3, INT_MIN, INT_MIN}); assert_equal(6, {1, 2, INT_MIN, INT_MIN, 3, INT_MIN, INT_MIN}); assert_equal(2, {5, -8, INT_MIN, INT_MIN, 2, INT_MIN, INT_MIN}); assert_equal(14, {-5, 10, -6, INT_MIN, INT_MIN, 5, INT_MIN, INT_MIN, 10, INT_MIN, INT_MIN}); assert_equal(1, {-5, -10, -6, INT_MIN, INT_MIN, 1, INT_MIN, INT_MIN, -10, INT_MIN, INT_MIN}); std::cout << "OK "; return 0; }