题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路
首先我们需要知道二叉树后序遍历序列的特点:最后一个节点为根节点,去掉根节点的话,可以把s列分为两部分,左边那部分所有节点值都比根节点小,右边那部分都比根节点大。下面看怎么解决这个题:
- 首先判断这棵树是否为空树,如果为空树的话,返回false;
- 不为空就重新写一个函数判断这棵树是否为二叉搜索树的后序遍历;
- 如果这个二叉树只有一个节点,那么肯定满足二叉排序树的性质,return true;否则就把这个序列划分成两部分,进行递归判断。
具体实现看代码和注释。
实现代码
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int sz=sequence.size();
if(sz==0)//二叉树为空树
return false;
else
return isLastOrder(sequence,0,sz-1);
}
bool isLastOrder(vector<int>&arr,int left,int right)
{
if(left==right)//一个节点的情况
return true;
int mid=left;
while(arr[mid++]<arr[right] && mid<right);
int temp=mid;//第一个右子树的节点
while(arr[temp++]>arr[right] && temp<right);
if(temp<right)//说明右边序列有比最后一个元素小的值,不满足后序遍历后续
return false;
if(mid==left || mid == right)//说明这个数只有左子树或者右子树
return isLastOrder(arr,left,right-1);
else
return (isLastOrder(arr,left,mid-1)&&isLastOrder(arr,mid,right-1));
}
};