题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
示例
输入: [1,3,2,6,5]
输出: true
算法思路
二叉搜索树的特点:左子树所有节点小于根节点,右子树的所有节点大于根节点。它的子树也遵循这个规律。
树的后序遍历顺序是:左子树、右子树、根
由上面两个特点可以得出以下思路:
- 定义左右指针 left=0,right=nums.length-1,递归遍历,当 left>=right ,说明此时只有一个节点,返回true
- 定义一个移动指针 k=left,当nums[k] < nums[right](根节点)时,一直往右移,即k++
- 当 k 不动时,说明此时nums[k] > nums[right],说明右子树开始了,记录这个k的值,它是此刻右子树的开始
- 当 nums[k] > nums[right]时,k++,当 k=right时,停止。说明当前这棵树符合 左子树的所有节点 < 根节点,右子树的所有节点 > 根节点。
- 递归遍历,看它子树是否满足左子树的所有节点 < 根节点,右子树的所有节点 > 根节点。
代码实现
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
int n = sequence.length;
if(n==0) return false;
return recur(sequence,0,n-1);
}
private boolean recur(int [] nums,int left,int right){
//递归终止条件
if(left>=right) return true;
int k = left;
//左子树小于根节点
while(nums[k]<nums[right]) k++;
//找到切分左右子树的临界点
int mid = k;
//右子树大于根节点
while(nums[k]>nums[right]) k++;
//递归遍历
return k==right && recur(nums,left,mid-1) && recur(nums,mid,right-1);
}
}