给定一颗二叉树的头节点head,返回这棵二叉树中最大的二叉搜索子树
(二叉搜索树:该二叉树中左子树所有节点比它小,右子树所有节点比它大 );
思路:
这是一道分析可能性求解在二叉树上做类似动态规划的问题(树形dp),这种题就是一种递归套路,我们要分析求解的可能性,并由此找到我们所需要的信息,进而通过递归求解;
这道题有两种可能性:
1,与头节点无关
所需信息:
1.1,左树最大二叉搜索树大小
1.2,右树最大二叉搜索树大小
2,与头节点有关
所需信息:
2.1,左树为二叉搜索树
2.2,右树为二叉搜索树
2.3,左树节点的最大值max<x<右树节点的最小值min
由此我们可以知道我们所需要的信息info:
1,最大搜索树的大小maxSubBSTSize;
2,布尔类型判断是否为二叉搜索树isAllBST;
3,最大值max和最小值min
代码如下:
class Node{
public:
int val;
Node* left;
Node* right;
};
class info{
private:
int MaxSubBSTSize;
bool isAllBST;
int Max;
int Min;
public:
info(int Maxsize, bool is, int ma, int mi)
{
this->MaxSubBSTSize=Maxsize;
this->isAllBST=is;
this->Max=ma;
this->Min=mi;
}
info process(Node* root)
{
if(!root)
return NULL;
info leftInfo=process(root->left);
info rightInfo=process(root->right);
int Max=root->val;
int Min=root->val;
if(leftInfo)
{
Min=min(Min,leftInfo.Min);
Max=max(Max,leftInfo.Max);
}
if(rightInfo)
{
Min=min(Min,rightInfo.Min);
Max=max(Max,rightInfo.Max);
}
int MaxSubBSTSize=0;
if(leftInfo)
{
MaxSubBSTSize=leftInfo.MaxSubBSTSize;
}
if(rightInfo)
{
MaxSubBSTSize=max(MaxSubBSTSize,rightInfo.MaxSubBSTSize);
}
bool isAllBST=false;
if(
(!leftInfo?true:leftInfo.isAllBST)
&&
(!rightInfo?true:rightInfo.isAllBST)
&&
(!leftInfo?true:leftInfo.max<root->val)
&&
(!rightInfo?true:rightInfo.min>root->val)
)
{
MaxSubBSTSize=(!leftInfo?0:leftInfo.MaxSubBSTSize)+(!rightInfo?0:rightInfo.MaxSubBSTSize)+1;
this->isAllBST=true;
}
return new Info(MaxSubBSTSize,isAllBST,max,min);
}
};
注:代码用到了一些java语法,c++无法正常运行