问题重述:
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false.假设输入的数组任一两个数组都不相同。
思路解析:
首先这个数组是搜索二叉树的后序遍历,因为搜索二叉树满足左小右大的规则,并且后序遍历中最后一个遍历的是根节点,因此,我们能根据最后一个数字将数组分为两部分,前面的一部分都比最后一个节点小,后面的一部分都比最后一个节点大。
因此,整体思路是这样的:将最后一个数字作为根节点提出来,从头开始和这个数字进行比较,当遇到第一个比根节点大的数字的时候跳出并记录下位置,假设这个位置为i,数组的长度为length,那么0到i-1都是左子树,i到length-1都是右子树,再找到i以后,我们从i处继续往后遍历,如果遇到比根节点小的树,那么这个树就不是二叉搜索树。递归的进行判断即可。
代码实现:
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
//思路:从二叉搜索树的性质上进行判断:左小右大
//所以:中序后序遍历数组中的树总满足这样的性质:一半的数都比自己小,另一半的数都比自己大
if(sequence.size()<1)
return false;
int length = sequence.size()-1;
return Verfy(sequence,0,length);
}
bool Verfy(vector<int>sequence,int start,int end)
{
int root = sequence[end];
//找到左边的节点
int i = 0;
for(;i<end;++i)
if(sequence[i]>root)
break;
//在右子树中遇到比根小的就返回false
int j = i;
for(;j<end;++j)
if(sequence[j]<root)
return false;
//判断左右子树
bool left = true;
if(i>0)
left = Verfy(sequence,0,i-1);
bool right = true;
if(j<end)
right = Verfy(sequence,i,end-1);
return left&&right;
}
};