面试题33. 二叉搜索树的后序遍历序列
https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/
方法1 递归法
思路
采用先序遍历(自顶向下的方式),分解原问题。
本题的关键点在于,如果划分左、右子树和根节点。由于题目假定数组为后序遍历,存在如下规律:
- 最后一个节点必为根节点
- 区间从左到右,第一个大于根节点的值为右子树的根节点。
以上述两点可以划分左、右子树和根节点。
依据左、右子树不断的递归求解。
返回条件
- 区间长度小于1时,直接返回true,一个节点的树可视为后序遍历。
- 如果左子树存在一个大于根节点的值 或者右子树存在一个小于根节点的值,则不满足二叉平衡树定义,则返回false。
java代码
public boolean verifyPostorder(int[] postorder) {
if(postorder.length==0) return true;
return recur(postorder, 0, postorder.length-1);
}
public boolean recur(int[] nums, int i, int j){
if(i>=j) return true;
int p=i;
while(nums[p]<nums[j]) p++;
int m = p;
for(int ii=i;ii<m; ii++)
if(nums[ii]>nums[j]) return false;
for(int ii=m; ii<j; ii++)
if(nums[ii]<nums[j]) return false;
return recur(nums, i, m-1) && recur(nums, m, j-1);
}