题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历序列的结果,如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
经典的问题,二叉树的题目很多都是用递归来解决。注意到二叉查找树的后序序列的最后一个数为根结点数据,它应该比左孩子大,比右孩子小,根据这个特点递归地检查数组中是否所有元素都满足这个特点。
下面总结几种写法(均通过了所有测试用例)。
递归基本写法:
class Solution
{
public:
bool Is_BST(vector<int> &sequence,int start,int end)
{
if (start == end)
return true;
if(start > end)
return false;
int root = sequence[end];
int mid = start;
while (sequence[mid++] < root && mid < end);
int temp = mid;
while (sequence[temp++] > root && temp < end);
if (temp < end)
return false;
if(mid == start || mid == end)
{
return Is_BST(sequence, start, end-1);
}
return Is_BST(sequence,start,mid) && Is_BST(sequence,mid,end);
}
bool VerifySquenceOfBST(vector<int> sequence){
return Is_BST(sequence,0,sequence.size() - 1);
}
};
class Solution
{
public:
bool IsBST(vector<int> &sequence){
int length = sequence.size();
if (length == 1 || length == 0)
{
return true;
}
int root = sequence[length-1];
vector<int> leftSequence;
vector<int> rightSequence;
int i = 0;
for (;i < length-1;++i)
{
if (sequence[i] <= root)
{
leftSequence.push_back(sequence[i]);
}
else
{
break;
}
}
for (;i < length-1;++i)
{
if (sequence[i] > root)
{
rightSequence.push_back(sequence[i]);
}
else
{
return false;
}
}
return IsBST(leftSequence) && IsBST(rightSequence);
}
bool VerifySquenceOfBST(vector<int> sequence)
{
int length = sequence.size();
if (length == 0)
{
return false;
}
return IsBST(sequence);
}
};
非递归写法,不过也是沿用递归的思路,这种写法比较精妙,基本想法是,如果是后序遍历序列,那么所有的左孩子都应该比右孩子小才对,一个一个这样比较就好了。
class Solution
{
public:
bool VerifySquenceOfBST(vector<int> sequence){
int length = sequence.size();
if (length == 0)
return false;
int i = 0;
while (--length)
{
while (sequence[i++] < sequence[length]);
while (sequence[i++] > sequence[length]);
if (i < length)
return false;
else
return true;
i = 0;
}
return true;
}
};