【题目描述】
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
【解法】
//注意点:
1.后续遍历的特点:左子树右子树根节点
2.二叉搜索树的特点:左节点值<父节点值<右节点值
3.由1可知数组的最后一个元素值为父节点
4.所以从左到右先判断值是否小于数组结尾处的值,直到第一个大于结尾处值的元素就是右子树的开始,那么再将左右子树运用递归思想进行判断!
class Solution {
public:
vector<int> seq;//为了简便写法
bool VerifySquenceOfBST(vector<int> sequence) {
seq = sequence;
if(seq.empty()) return false;
return dfs(0, seq.size() - 1);
}
bool dfs(int l, int r)
{
if(l >= r) return true;
//父亲结点
int father = seq[r];
//左子树 都小于
int k = l;
while(k < r && seq[k] < father) k ++;
//右子树 都大于
for(int i = k; i < r; i ++)
if(seq[i] < father)
return false;
return dfs(l, k - 1) && dfs(k, r - 1);
}
};