題目描述:
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。
思路:
1、序列的的最後一個數字是根節點
2、二叉搜索樹左子樹的節點都比根節點小,右子樹的節點都比根節點大。
C++遞歸與非遞歸實現代碼:
#include <iostream>
#include <vector>
#include <set>
using namespace std;
class Solution
{
private:
//參數爲引用,不爲值傳遞是爲了防止拷貝構造函數的無限遞歸,最終導致棧溢出。
bool judge(vector<int> &sequence, int left, int right)
{
if (left == right)
return true;
int mid = left;
while (sequence[mid] < sequence[right] && mid < right)
{
mid++;
}
int tmp = mid;
while (sequence[tmp] > sequence[right] && tmp < right)
{
tmp++;
}
if (tmp < right)
{
return false;
}
if (mid == left || mid == right)
{
return judge(sequence, left, right - 1);
}
else
{
return judge(sequence, left, mid - 1) && judge(sequence, mid, right - 1);
}
}
public:
bool VerifySquenceOfBST(vector<int> sequence)
{
int size = sequence.size();
if (0 == size)
return false;
int i = 0;
while (--size)
{
while (sequence[i] < sequence[size])
{
i++;
}
//while (sequence[i++] < sequence[size]);
//while (sequence[i++] > sequence[size]);
while (sequence[i] > sequence[size])
{
i++;
}
if (i < size)
return false;
i = 0;
}
return true;
}
bool VerifySquenceOfBSTRecursize(vector<int> sequence)
{
int length = sequence.size();
if (length == 0)
return false;
return judge(sequence, 0, length - 1);
}
};
int main()
{
vector<int> tree1{5, 7, 6, 9, 11, 10, 8};
vector<int> tree2{4, 8, 6, 12, 16, 14, 10};
vector<int> tree3{2, 1, 7, 4, 6, 5, 3};
Solution solution = Solution();
bool tmp = solution.VerifySquenceOfBST(tree3);
cout << boolalpha << tmp << endl;
return 0;
}