1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
#include<bits/stdc++.h> using namespace std; struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} };
class Solution { int ans=0; struct no{ int maxx=INT_MIN,minn=INT_MAX,sum=0; }; no dfs(TreeNode* r) { if(!(r->left||r->right)) { ans=max(ans,r->val); return {r->val,r->val,r->val}; }
no ls,rs; if(r->left) ls=dfs(r->left); if(r->right) rs=dfs(r->right);
if(r->right&&r->left) { if(ls.maxx<r->val&&r->val<rs.minn) { ans=max(ans,rs.sum+r->val+ls.sum); return {rs.maxx,ls.minn,rs.sum+r->val+ls.sum}; } } else if(r->right) { if(r->val<rs.minn) { ans=max(ans,r->val+rs.sum); return {rs.maxx,r->val,r->val+rs.sum}; } } else if(r->left) { if(ls.maxx<r->val) { ans=max(ans,ls.sum+r->val); return {r->val,ls.minn,ls.sum+r->val}; } } return {INT_MAX,INT_MIN,INT_MIN}; } public: int maxSumBST(TreeNode* root) { dfs(root); return ans; } };
signed main() { Solution s; return 0; }
|