二叉搜索树:
左子树的所有结点均小于根节点,右子树的所有结点均大于根节点。左右子树也分别符合这个规律。
左子树<根节点<右子树
如果对二叉搜索树进行中序遍历,则遍历结果是自小至大有序的。
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true
看到这种前序遍历、中序、后续遍历,是DFS,就要想到有两种解法,递归和栈
本题同样:
class Solution { //递归解法
public:
bool verifyPostorder(vector<int>& postorder) {
return helper(postorder,0,postorder.size()-1);
}
bool helper(vector<int>& postorder,int begin,int end){
if(begin>=end) return true;
int root=postorder[end];
int temp;
for(int i=begin;i<end;i++){
if(postorder[i]>root){
temp=i;
for(int j=temp+1;j<end;j++){
if(postorder[j]<root){
return false;
}
}
break;
}
temp=i+1;
}
return helper(postorder,begin,temp-1)&&helper(postorder,temp,end-1);
//注意,在进行分冶时,采用的是传入子vector,因此就要不断递归分割来形成子vector,没找到简单的分割办法,只能用assign,导致代码很长很麻烦,最后还有bug。
//所以采用只传入pos,这样代码就就爽朗多, 很容易就AC。
//注意,在使用递归的时候,一定要定义收敛条件,基本上就是递归函数的第一行return代码。不然一直递归下去无法收敛而导致程序栈溢出。
}
};
//单调栈的解法