题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。
数据范围: 节点数量 0≤n≤1000 ,节点上的值满足 1≤val≤ ,保证节点上的值各不相同
要求:空间复杂度 O(n) ,时间时间复杂度 O()
提示:
1.二叉搜索树是指父亲节点大于左子树中的全部节点,但是小于右子树中的全部节点的树。
2.该题我们约定空树不是二叉搜索树
3.后序遍历是指按照 “左子树-右子树-根节点” 的顺序遍历
解析
二叉树大多时候都会用递归。
约定了空树不是搜索二叉树,因此首先需要检查每一个根节点下的左孩子是否小于根节点,右孩子是否大于根节点。
由于是后序遍历序列,由左右中的顺序,整棵树的根结点一定是Len-1这个结点。因此,整个序列中第一个比根节点大的点就是右子树的点,在这个点之前的所有点都是左子树的点。
用同样的办法对左子树和右子树进行判断,用递归法得出最终的结论。
代码
#include<stdbool.h>
bool Check_core(int *a, int Len)
{
int index;
int i;
bool flag = false;
if (a == NULL || Len <= 1)
return true;
for (i = 0; i < Len; i++)
{
if (!flag&&a[i] > a[Len - 1]) //判断从哪里开始是右子树,右子树的孩子一定都比其根节点大
{
index = i;
flag = true;
}
if (flag && a[i] < a[Len - 1]) //判断从哪里开始是左子树,左子树的孩子一定都比其根节点小
return false;
}
if (i == Len || index == 0)
return Check_core(a, Len - 1);
else
return Check_core(a, index)&& Check_core(a+index, Len- index-1); //分别判断左右子树是否满足小的都小,大的都大
}
bool VerifySquenceOfBST(int* sequence, int sequenceLen ) {
if (sequence == NULL || sequenceLen <= 0)
return false;
return Check_core(sequence, sequenceLen);
}