遞歸:
bool pp(const vector<int> vi, int start, int end)
{
if (start >= end)return 1;
int i = start;
while (i <= end && vi[i] < vi[end])i++;
for (int j = i;j <= end;j++)if (vi[j] < vi[end])return 0;
return pp(vi, start, i - 1) && pp(vi, i, end - 1);
}
bool VerifySquenceOfBST(vector<int> sequence)
{
if (sequence.empty())return 0;
if (sequence.size() == 1)return 1;
return pp(sequence, 0, sequence.size() - 1);
}
思路:後序遍歷的最後一個元素一定是樹根。除樹根外,前面的元素可以分爲兩部分,左子樹的值和右子樹的值。左子樹的值都小於根,右子樹的值都大於根。如果在遞歸過程中發現右子樹的值小於根,那麼false。
非遞歸:
bool VerifySquenceOfBST(vector<int> sequence)
{
if (sequence.empty())return 0;
if (sequence.size() == 1)return 1;
int i = 0, size = sequence.size() - 1;
while (size > 0)
{
while (sequence[i] < sequence[size])i++;
while (sequence[i] > sequence[size])i++;
if (i < size)return 0;
i = 0;
size--;
}
return 1;
}