2021/4/2,还是要好好刷算法题啊,题意如下:
二叉搜索树的特点是左子树的值都比根节点小,右子树的值都比根节点大。而后序遍历的根节点在最后,所以我们可以根据值和根节点的大小关系分为左子树和右子树。找到左子树和右子树后判断是否满足和根节点的条件,然后再用递归的思想继续判断左子树和右子树,都满足条件就返回true。
c++参考代码:
class Solution {
public:
bool pd(vector<int>& postorder,int l,int r)
{
if(l>=r)
return true;
int now=l;
while(postorder[now]<postorder[r])//找左子树
now++;
int now2=now;
while(postorder[now2]>postorder[r])找右子树
now2++;
return now2==r&&pd(postorder,l,now-1)&&pd(postorder,now,r-1);//是否满足二叉搜索树条件
}
bool verifyPostorder(vector<int>& postorder) {
return pd(postorder,0,postorder.size()-1);
}
};
时间复杂度:O(N2),空间复杂度:O(N)。
参考资料
·依旧是K神的题解