题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:由二叉排序树(二叉搜索树)的性质可知,左边子数上的任意节点都要比根节点小,且右边子数上的任意节点都要比根节点大。则根据这个性质,我们可以运用递归解决这个问题,由后序序列的性质有,最后一个节点必定是根节点。那么可以找到第一个比根节点大的数,那么就是右子树的开头,然后在慢慢递归下去,将序列分为两部分。
代码为:
/*二叉搜索树也为二叉排序数,即一个节点的左子树上的节点均小于根节点而右子数上的节点均大于根节点*/
class Solution {
public:
bool Judge(vector<int> sequence,int start,int end)
{
int i;
if(start==end) return true;
for(i=start;i<end;i++)
if(sequence[i]>sequence[end]) break;
for(int j=i;j<end;j++)
if(sequence[j]<sequence[end]) return false;
bool left = true;
bool right = true;
if(i>0) left = Judge(sequence,start,i-1);
if(i<end-1) right = Judge(sequence,i,end-1);
return left&&right;
}
bool VerifySquenceOfBST(vector<int> sequence)
{
int length = sequence.size();
if(length==0) return false;
bool ok = Judge(sequence,0,length-1);
return ok;
}
};