题目描述
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
算法分析
- 递归法:BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。
- 迭代法:左子树一定比右子树小,因此去掉根后,数字分为left,right两部分,right部分的最后一个数字是右子树的根,他比左子树所有值大,也比right的左子树大,因此我们可以每次只看右子树是否符合条件即可。
提交代码:
class Solution {
public:
/* 迭代法 */
bool VerifySquenceOfBST(vector<int> sequence) {
if (sequence.empty())
return false;
int size = sequence.size();
int i = 0;
while (--size)
{
while (sequence[i++] < sequence[size]);
while (i <= size && sequence[i++] > sequence[size]);
if (i < size)
return false;
i = 0;
}
return true;
}
/* 递归法 */
bool VerifySquenceOfBST2(vector<int> sequence) {
if (sequence.empty())
return false;
return VerifySquenceOfBSTCore(sequence,
0, sequence.size() - 1);
}
bool VerifySquenceOfBSTCore(vector<int> &seq, int beg, int end)
{
if (beg >= end)
return true;
int i = beg;
for (; i < end; ++i)
{
if (seq[i] > seq[end])
break;
}
int j = i;
for (; j < end; ++j)
{
if (seq[j] < seq[end])
return false;
}
return VerifySquenceOfBSTCore(seq, beg, i - 1)
&& VerifySquenceOfBSTCore(seq, i, end - 1);
}
};
测试代码:
// ====================测试代码====================
void Test(const char* testName, vector<int> sequence, bool expected)
{
if (testName != nullptr)
printf("%s begins: ", testName);
Solution s;
if (s.VerifySquenceOfBST(sequence) == expected)
printf("passed.\n");
else
printf("failed.\n");
}
// 10
// / \
// 6 14
// /\ /\
// 4 8 12 16
void Test1()
{
vector<int> data = { 4, 8, 6, 12, 16, 14, 10 };
Test("Test1", data, true);
}
// 5
// / \
// 4 7
// /
// 6
void Test2()
{
vector<int> data = { 4, 6, 7, 5 };
Test("Test2", data, true);
}
// 5
// /
// 4
// /
// 3
// /
// 2
// /
// 1
void Test3()
{
vector<int> data = { 1, 2, 3, 4, 5 };
Test("Test3", data, true);
}
// 1
// \
// 2
// \
// 3
// \
// 4
// \
// 5
void Test4()
{
vector<int> data = { 5, 4, 3, 2, 1 };
Test("Test4", data, true);
}
// 树中只有1个结点
void Test5()
{
vector<int> data = { 5 };
Test("Test5", data, true);
}
void Test6()
{
vector<int> data = { 7, 4, 6, 5 };
Test("Test6", data, false);
}
void Test7()
{
vector<int> data = { 4, 6, 12, 8, 16, 14, 10 };
Test("Test7", data, false);
}
void Test8()
{
Test("Test8", vector<int>(), false);
}
int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
Test8();
return 0;
}