题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 思路分析:我们首先要知道二叉搜索树的性质(即就是:二叉树搜索树它的左子树都比根节点小,右子树都比根节点大,并且二叉搜索树的中序遍历是有序的)。根据这个思路我们再结合递归,来进行二叉搜索树的后序遍历。
还有就是后序遍历的顺序是左子树–>右子树–>根节点
代码实现:
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence)
{
if(sequence.empty())
return false;
return bst(sequence,0,sequence.size()-1);
}
bool bst(vector<int> seq, int begin, int end){
// 判空
if(seq.empty() || begin > end)
return false;
// 划分左右子树,并判断左右子树和根节点的关系
//在二叉搜索树中,左子树都小于根节点
int i = begin;
for(; i < end; ++i)
if(seq[i] > seq[end])
break;
//在二叉搜索树中,右子树都大于根节点
int j = i;
for(; j < end; ++j)
if(seq[j] < seq[end])
return false;
// 判断左子树是不是二叉搜索树
bool left = true;
if(i > begin)
left = bst(seq, begin, i - 1);
// 判断右子树是不是二叉搜索树
bool right = true;
if(i < end - 1)
right = bst(seq, i , end - 1);
return left && right;
}
};
- 另外一种接口,思想方法一样
bool VerifySquenceOfBST(int sequence[], int length)
{
if (sequence == NULL || length <= 0)
return false;
int root = sequence[length - 1];
//左子树
int i = 0;
for (; i < length - 1; 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;
}