剑指offer系列第23题
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
首先,明确二叉排序树的特点:
- 左子树不空,则左子树的值小于根节点的值
- 右子树不空,则右子树的值大于根节点的值
- 左右子树均为二叉排序树。
以上述二叉排序树为例,后序遍历的结果为{2,4,3,9,13,7,6,17,20,18,15}
。后序遍历的最后一个节点一定为根节点,由二叉排序树特点可知,左子树的值都小于根节点,右子树的值都大于根节点值,因而后序遍历结果可以分为前后两部分,{2,4,3,9,13,7,6}
为左子树,{17,20,18}
为右子树。6和18又分别是左右子树的根节点,因而可以看出这是一个递归过程。
对于题目来说,当在后部分遍历到比根节点小的值时,可以立马返回false。
思路:
- 找到root
- 遍历数组,与root比较,分为左右子树两部分(当在后部分遍历到比根节点小的值时,可以立马返回false)
- 递归调用判断是否二叉搜索树的后序遍历序列
代码实现:
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int n=sequence.size();
if(n==0)
return false;
int root=sequence[n-1];
vector<int> left;
vector<int> right;
int i=0;
for(i;i<n-1;i++)
{
if(sequence[i]<root)
left.push_back(sequence[i]);
else
break;
}
for(i;i<n-1;i++)
{
if(sequence[i]>root)
right.push_back(sequence[i]);
else
return false;
}
VerifySquenceOfBST(left);
VerifySquenceOfBST(rihgt);
return 1;//如果前面出现不是二叉搜索树的后序遍历序列时自然会返回false,因而直接返回1就是。
}
};
解决思路肯定不是最优,代码实现也不是最精简的,但是容易理解。
代码已在OJ测试通过。