题目
二叉搜索树的后序遍历序列
描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。完美的递归定义 : )
package com.wy.offer;
/**
* @date 2018/3/28 23:31
*/
public class T23 {
public static void main(String[] args) {
int []arr = new int[]{3,9,12,11,13,10,16,14,6}; //后序
int []arr2 = new int[]{6,3,14,10,9,13,11,12,16}; //前序
System.out.println( T23.VerifySquenceOfBST(arr) );
System.out.println( T23.VerifySquenceOfBST(arr2) );
}
public static boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length==0)
return false;
if(sequence.length==1)
return true;
return ju(sequence, 0, sequence.length-1);
}
private static boolean ju(int[] a,int left,int right){
if(left>=right)
return true;
int i = right;
//从后面开始找
while(i>left&&a[i-1]>a[right])
i--;//找到比根小的坐标
//从前面开始找 star到i-1应该比根小
for(int j = left;j<i-1;j++)
if(a[j]>a[right])
return false;
//将数据分成两段后重复操作
return ju(a,left,i-1)&&ju(a, i, right-1);
}
}