思路:labuladong
题目:
给你一棵以 root 为根的 二叉树 ,请你返回 任意 二叉搜索子树的最大键值和。
*
* 二叉搜索树的定义如下:
* 任意节点的左子树中的键值都 小于 此节点的键值。
* 任意节点的右子树中的键值都 大于 此节点的键值。
* 任意节点的左子树和右子树都是二叉搜索树。
比如题目给了这个例子:
如果输入这棵二叉树,算法应该返回 20,也就是图中绿圈的那棵子树的节点值之和,因为它是一棵 BST,且节点之和最大。
那有的读者可能会问,根据 BST 的定义,有没有可能一棵二叉树中不存在 BST?
不会的,因为按照 BST 的定义,任何一个单独的节点肯定是 BST,也就是说,再不济,二叉树最下面的叶子节点肯定是 BST
思路:
递归到每个节点时,我们需要知道左右子树是否为bst、最大值、最小值、累加值。然后通过这些信息判断以该节点为根节点的子树是否为bst。
因此使用后序遍历,在递归时同时获取这些值并返回
class Solution { public: int maxsum=0; int maxSumBST(TreeNode* root) { traverse(root); return maxsum; } struct Param { bool isbst; int min; int max; int sum; }; Param traverse(TreeNode* root){ if(root==nullptr){ return {true,INT_MAX,INT_MIN,0}; } Param leftp=traverse(root->left); Param rightp=traverse(root->right); Param p; if(leftp.isbst&&rightp.isbst&& root->val>leftp.max&& root->val<rightp.min){ p.isbst=true; p.min=min(root->val,leftp.min); p.max=max(root->val,rightp.max); p.sum=leftp.sum+root->val+rightp.sum; maxsum=max(maxsum,p.sum); }else{ p.isbst=false; } return p; } };