剑指 Offer 33. 二叉搜索树的后序遍历序列
题目链接
剑指 Offer 33. 二叉搜索树的后序遍历序列
思路分析
- 对于二叉搜索树来讲,它的最大特性就是如果左右孩子存在,那么右孩子一定大于左孩子,并且按照后序遍历的规则,数组的最后一个节点就是二叉树的根节点
- 如果能确定根节点,我们又知道左右子树的分割点,我们就能将完整的树分为左右子树,如果是一颗搜索树,那么可以得到的是右子树的每一个节点的值都大于根节点,就可以依据这个来判断是否是二叉搜索树
- 接着按照这种方法,对左右子树继续进行判断
代码实现
class Solution {
public:
bool isPostorder(vector<int>& postorder, int start, int end)
{
if(start >= end)
return true;
int root = end;
int flag = start;
for(; flag < end; ++flag)
{
if(postorder[flag] > postorder[root])
break;
}
int tmp = flag;
for(; tmp < end; ++tmp)
{
if(postorder[tmp] < postorder[root])
{
return false;
}
}
return isPostorder(postorder, start, flag-1) && isPostorder(postorder, flag, end-1);
}
bool verifyPostorder(vector<int>& postorder) {
if(postorder.size() == 0)
return true;
return isPostorder(postorder, 0, postorder.size()-1);
}
};