方法一:递归实现
我需要知道二叉搜索树的右边所有的节点都要比根节点大
左边的所有节点都比根节点小
1.给的后序遍历的最后一个节点是根节点
2.从左到右遍历序列,第一个比根节点大的节点后面都是右子树,前面都是左子树
class Solution {
public:
bool verifyPostorder(vector<int>& postorder) {
return helper( postorder, 0, postorder.size() - 1 );
}
bool helper( vector<int>& postorder, int left ,int right )
{
//因为是二叉搜索树,如果最左边的等于最右边的表示只有一个节点,如果left > right表示没有节点
if( left >= right )
return true;
int mid = left;
int root = postorder[right];
while( postorder[mid] < root )
mid++;
//postorder[mid]前面的值都是比root根节点小的值,且为根节点的左子树
//后面都是右子树,所以如果后面的比根节点要小,说明不是二叉搜索树,返回false
int tempIndex = mid;
while( tempIndex < right )
{
if( postorder[tempIndex++] < root )
return false;
}
//然后对区分开的左右子树递归进行判断
return helper( postorder, left, mid -1 ) && helper( postorder, mid, right - 1);
}
};