输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则返回true,否则返回false。
假设输入的数组的任意两个数字都互不相同。
样例
输入:[4, 8, 6, 12, 16, 14, 10]
输出:true
每次将数组分成左右子树的后序遍历对应的数组[st,i - 1] [i,ed] ,然后递归判断符不符合即可。
class Solution {
public:
bool is_valid(vector<int>& nums,int st,int ed){
if (st >= ed) return true; // 只有一个结点的树或者空树肯定是满足后序遍历的
int root = nums[ed];
int i;
for (i = st; i < ed; ++i){
if (nums[i] > root)
break;
}
for (int j = i; j < ed; ++j){ // 如果右半边数组中还有比根节点大的元素,就肯定不满足后序遍历了。
if (nums[j] <= root)
return false;
}
return is_valid(nums,st,i - 1) && is_valid(nums,i,ed - 1);
}
bool verifySequenceOfBST(vector<int> nums) {
int n = nums.size();
return is_valid(nums,0,n - 1);
}
};