大致思路:
思路比较简单粗暴:先找到根节点,然后去遍历序列,找到第一个大于根节点值的元素则为左子树的开头,以此划分开左右子树,递归(二叉树一般都递归!!!!)。
要注意的点在于,有可能某个根节点没有左子树和右子树,应该怎么处理; 递归的临界条件有哪些情况(只剩一个结点、只剩两个结点),如何对这些情况进行正确判断。
AC代码:
class Solution {
public:
bool varify(vector<int> s, int start, int end,int root)
{
if(start==end+1) //其实只有根节点
return true;
if(start==end) //除根节点外就一个元素了
return s[start]<root;
if(start+1==end) //就两个元素了
{
//两个元素也有可能是三种情况!!!!
return (s[start]<root&&s[end]>root)||(s[start]<root&&s[end]<root)||(s[start]>root&&s[end]>root);
}
//找到以此root划分左子树右子树的地方
int right_begin = 0;
for(int i=start;i<end;i++)
{
if(s[i]>root)
{
right_begin = i;
break;
}
}
//如果没有左子树
if(right_begin==start)
return varify(s,right_begin,end-1,s[end]);
//如果没有右子树
if(right_begin==0)
return varify(s,start,end-1,s[end]);
else
{
//右子树的元素是不是都大于root
for(int i=right_begin;i<end;i++)
{
if(s[i]<root)
return false;
}
}
//递归去看左子树和右子树
return varify(s,start,right_begin-2,s[right_begin-1])&&varify(s,right_begin,end-1,s[end]);
}
bool VerifySquenceOfBST(vector<int> sequence)
{
if(sequence.size()==0)
return false;
return varify(sequence,0,sequence.size()-2,sequence[sequence.size()-1]);
}
};