题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后续遍历的结果。
思路:
根据二叉搜索树的后续遍历结果的特点来判断:序列的最后一个数是根结点,且前面一部分的数 < 最后一个数,根结点之前的后一部分数 > 最后一个数。
类似这样的数组:5,7,6,9,11,10,8
如果满足上面的条件,然后再对两部分进行递归判断,否则直接返回false。
代码1:
#include<iostream>
#include <stack>
#include<queue>
using namespace std;
//功能:判断一个序列是否是一个二叉搜索树的后序遍历序列,如序列:5,7,6,9,11,10,8
//思路:递归,根结点位于最后,前半段< 最后,中间半段> 最后
//注意:递归结束条件,只有一个结点时返回真
bool VerifySquenceOfBST(int sequence[] , int length)
{
if(sequence == NULL || length <= 0)
return false;
if(length == 1)
return true;
int root = sequence[length - 1];
int i = 0 ;
for( ; i < length ; i++)
{
if(sequence[i] > root)
break;
}
int j = i ;
for( ; j < length - 1 ; j++)
{
if(sequence[j] < root)
return false;
}
bool left = true;
if(i > 0)
left = VerifySquenceOfBST(sequence , i);
bool right = true;
if(i < length - 1)
right = VerifySquenceOfBST(sequence + i , length - i - 1);
return left && right;
}
int main()
{
int a[] = {5,7,6,9,11,10,8};
cout<<VerifySquenceOfBST(a , sizeof(a) / sizeof(*a));
return 0;
}
代码2:
来自http://www.nowcoder.com/books/coding-interviews/a861533d45854474ac791d90e447bafd?rp=1.
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int len = sequence.size();
if(len == 0)
return false;
if(len == 1)
return true;
int i = 0;
for( ; i < len - 1 ; i++){
if(sequence[i] > sequence[len-1])
break;
}
int j = i;
for( ; j < len - 1 ; j++){
if(sequence[j] < sequence[len-1])
return false;
}
vector<int>::iterator iter = sequence.begin() ;
bool left = true;
//如果i==0,则左子树为空,此时不需要判断左子树
if(i > 0)
{
vector<int> pre(iter , iter + i);
left = VerifySquenceOfBST(pre);
}
bool right = true;
//如果i==len-1,则右子树为空,不再需要判断右子树
if(i < len - 1)
{
vector<int> post(iter + i , iter + len - 1);
right = VerifySquenceOfBST(post);
}
return left && right;
}
};