题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则返回true,否则返回false。
假设输入的数组的任意两个数字都互不相同。
样例
输入:[4, 8, 6, 12, 16, 14, 10]
输出:true
算法
后序遍历的最后一个节点是是根节点,所以我们只要找出比根节点小的部分为左子树,然后判断右边部分是否存在比根节点小的值,如果有返回false,否则的话就进行递归调用。
class Solution {
int[] seq;
public boolean verifySequenceOfBST(int [] sequence) {
seq = sequence;
if(seq.length == 0) return true;
return dfs(0,seq.length - 1);
}
public boolean dfs(int l,int r){
//如果k=l或者k=r,就会出现l>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);
}
}
还有一种思路就是将数组排序得到中序遍历,然后根据中序遍历和后序遍历重构二叉树。参考这篇重建二叉树