1373.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #define MAX(a, b) ((a) > (b) ? (a) : (b))
  2. #define MIN(a, b) ((a) < (b) ? (a) : (b))
  3. const int INF = 0x3f3f3f3f;
  4. struct TreeNode {
  5. int val;
  6. struct TreeNode *left;
  7. struct TreeNode *right;
  8. };
  9. typedef struct SubTree {
  10. bool isBST;
  11. int minValue;
  12. int maxValue;
  13. int sumValue;
  14. } SubTree;
  15. SubTree *createSubTree(bool isBST, int minValue,int maxValue, int sumValue) {
  16. SubTree *obj = (SubTree *)malloc(sizeof(SubTree));
  17. obj->isBST = isBST;
  18. obj->minValue = minValue;
  19. obj->maxValue = maxValue;
  20. obj->sumValue = sumValue;
  21. return obj;
  22. }
  23. SubTree* dfs(struct TreeNode* root, int *res) {
  24. if (root == NULL) {
  25. return createSubTree(true, INF, -INF, 0);
  26. }
  27. SubTree *left = dfs(root->left, res);
  28. SubTree *right = dfs(root->right, res);
  29. SubTree *ret = NULL;
  30. if (left->isBST && right->isBST &&
  31. root->val > left->maxValue &&
  32. root->val < right->minValue) {
  33. int sum = root->val + left->sumValue + right->sumValue;
  34. *res = MAX(*res, sum);
  35. ret = createSubTree(true, MIN(left->minValue, root->val), \
  36. MAX(root->val, right->maxValue), sum);
  37. } else {
  38. ret = createSubTree(false, 0, 0, 0);
  39. }
  40. free(left);
  41. free(right);
  42. return ret;
  43. }
  44. int maxSumBST(struct TreeNode* root){
  45. int res = 0;
  46. SubTree *obj = dfs(root, &res);
  47. free(obj);
  48. return res;
  49. }
备用站点 当前处于降级运行的备用站点,仅供应急访问,数据和功能可能不是最新。