一、题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
二、输入描述
一个数组
三、输出描述
判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No
四、牛客网提供的框架
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
}
};
五、解题思路
使用递归的方法。树的根节点是数组中的最后一个数。根据数组中的最后一个值,从数组前面开始查找,找到第一个比它的值大的位置。左边为左子树,右边为右子树。左子树的所有制都比根节点小;右子树的值应该都比根节点大,遍历右子树是否有存在比根节点小的数,如果有,返回false;否则递归判断左、右子树。
六、代码
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.size() < 1) return false;
bool result = inter(sequence, 0, sequence.size()-1);
return result;
}
bool inter(vector<int> sequence, int left, int right) //递归判断
{
if(left >= right) return true; //只有一个元素
int index = left;
int last = right; //子树的“根”节点
while(sequence[index] < sequence[last] && index < last-1) index++; //从左边开始,找出“根”节点的位置
for(int i = index + 1; i < right; i++) //判断右子树中是否存在着大于根节点的值,如果有返回false。
{
if(sequence[i] < sequence[last]) return false;
}
bool leftResult = inter(sequence, left, index); //递归判断左子树
bool rightResult = inter(sequence, index+1, right-1); //递归判断右子树
return leftResult && rightResult;
}
};