问题描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
由后序遍历的方式可以知道,后序遍历最后一个节点是root节点,那么选取root节点,将左右子树与root节点相比较,如果左子树所有的节点比root小,右子树所有的节点比root大,那么满足条件,否则不满足。具体写代码的时候需要找到一个区分左右子树的位置,将该树分为两部分,每一部分左边位置确定,右边位置减一,直到 l>=r,由于左子树节点均比root节点小,那么找到seq[k]<root时,那么说明是左子树上的节点,直到不满足条件的时候那么说明是该位置是区分左右子树的位置,即为所要的 k,然后再遍历右子树,如果都满足条件,那么需要进一步遍历左右子树(相对于根节点root而言例如 5 节点)里面的左右子树(相对于左右子树里面的各自子树的root而言如 2 或者 6 节点)。
class Solution {
public:
vector<int> seq;
bool verifyPostorder(vector<int>& postorder) {
seq=postorder;
return dfs(0,seq.size()-1);
}
bool dfs(int l,int r)
{
if(l>=r) return true;
int root=seq[r];
int k=l;
while(k<r&&seq[k]<root) k++;
for(int i=k;i<r;i++)
{
if(seq[i]<root) return false;
}
return dfs(l,k-1)&& dfs(k,r-1);
}
};