题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5
/ \
2 6
/ \
1 3
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true
思路:
首先我们要明白什么是二叉搜索树,简单来介绍一下就是根节点的左节点一定比根节点小,根节点的右子节点一定比根节点大,根节点的左子树节点值一定都比根节点小,根节点的右子树节点值一定都比根节点大。
知道这一知识点其实就可以来慢慢分析了,如何判断一个数组是不是二叉搜索树,首先我们很明显的可以发现数组的最后一个数字值肯定是这棵树的根节点,整个树如果有左右子树是不是二叉搜索树的一个特点就是,数组左边一部分的数字都比根节点值小,右边一部分的数字都比根节点大。所以我们先可以把这个数组砍成三部分,一个左子树,一个右子树,一个根节点,在这个分析过程中我们一直是把根节点当作核心来分析,但二叉树的天生递归性质让我们很快就可以发现对于根节点的左右子节点我们一样也可以用这个分析过程,所以我们只需要不断地的递归就行了。
bool verifyPostorder(int* postorder, int postorderSize){
if(postorderSize==0||postorderSize==1)
return true;
int i=0,j=0;
for(i=0;i<postorderSize-1;i++){
if(postorder[i]>postorder[postorderSize-1])
break;
}
for(j=i;j<postorderSize-1;j++){
if(postorder[j]<postorder[postorderSize-1])
return false;
}
return verifyPostorder(postorder,i)&&verifyPostorder(&postorder[i],postorderSize-i-1);
}