-
BST的特点是对任意结点,左子树小于该结点,右子树大于该结点。
-
后序遍历产生的序列为左子树-右子树-结点。
-
所以可知后序遍历序列的最后一个元素即为BST的根,再根据大小规律,可以找到左右子树对应的序列。递归处理这两个序列即可。
-
找左右子树序列时可采用二分查找法,虽然左右子树序列不是完全有序。
class Solution {
public:
int bSearch(const vector<int> &vec, int beg, int end, int k)
{
while (beg <= end)
{
int mid = (beg + end) / 2;
if (k == vec[mid])
{
return mid;
}
if (k < vec[mid])
{
end = mid - 1;
}
else
{
beg = mid + 1;
}
}
return beg;
}
bool search(const vector<int> &vec, int beg, int end)
{
if (beg >= end)
{
return true;
}
cout << beg << "," << end << endl;
int root = vec[end];
int loc = bSearch(vec, beg, end - 1, root);
if (find_if(vec.begin() + beg, vec.begin() + loc, [root](int a){return a >= root;}) != (vec.begin() + loc)
|| find_if(vec.begin() + loc, vec.begin() + end, [root](int a){return a <= root;}) != (vec.begin() + end))
{
cout << "error : " << beg << "," << end << "," << loc << endl;
return false;
}
return search(vec, beg, loc - 1) && search(vec, loc, end - 1);
}
bool VerifySquenceOfBST(vector<int> sequence) {
if (sequence.empty())
{
return false;
}
return search(sequence, 0, sequence.size() - 1);
}
};