28.二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则返回true,否则返回false。
假设输入的数组的任意两个数字都互不相同。
样例
输入:[4, 8, 6, 12, 16, 14, 10]
输出:true
思路
首先要想,一个二叉搜索树的后续遍历结果意味着什么?
- 根节点一定是数组的最后一个元素(左右根)。
- 数组中一定有一段连续的子数组比根节点小,这是左子树部分;对应的,一定有一段连续的子数组比根节点大,这是右子树部分。
我们可以从前往后遍历数组,找到这样一个元素,它的前面的元素都比10小,从它开始到10都比10大。然后递归地再去这两个子数组中(左子树,右子树)中判断,判断结果取&&。
class Solution {
public boolean verifySequenceOfBST(int [] sequence) {
int[] seq =sequence;
if(seq==null || seq.length==0)
{
return true;
}
return dfs(0,seq.length-1,seq);
}
public boolean dfs(int l,int r,int[] seq)
{
if(l>=r) return true;
int root=seq[r];
int cur=l;
while(cur<r)
{
if(seq[cur++]>seq[r]) break;
}
for(int i=cur;i<r;i++)
{
if(seq[i]<seq[r]) return false;
}
return dfs(l,cur-1,seq)&&dfs(cur,r-1,seq);
}
}