剑指offer-二叉搜索树的后序遍历序列
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
方法一:使用递归
1 public class Solution {//树 my 2 public boolean VerifySquenceOfBST(int [] sequence) { 3 if(null == sequence||0==sequence.length){ 4 return false; 5 } 6 return help(sequence,0,sequence.length-1); 7 } 8 public boolean help(int[] sequence,int left,int right){ 9 if((right-left)<=1){ 10 return true; 11 } 12 int i=left; 13 int mid = left; 14 while(i<right&&sequence[i]<sequence[right]){ 15 i++; 16 } 17 mid = i; 18 while(i<right&&sequence[i]>sequence[right]){ 19 i++; 20 } 21 if(i!=right){ 22 return false; 23 } 24 return help(sequence,left,mid-1)&&help(sequence,mid,right-1); 25 } 26 }
方法二:非递归方法,左子树一定比右子树小,去掉根后,数字分为左子树和右子树两部分,起皱去掉根后右子树的最后一个数字是右子树的根,他一定比左子树的所有值大,左子树的所有值可以看做右子树根的左子树一部分,因此可以值看右子树是否符合条件;
对于左子树回到了原问题。
1 public boolean VerifySquenceOfBST(int [] sequence) {//树 mytip 2 if(null == sequence||0==sequence.length){ 3 return false; 4 } 5 int len = sequence.length-1; 6 while(0!=len){ 7 int i=0; 8 while(sequence[i]<sequence[len]){ 9 i++; 10 } 11 while(sequence[i]>sequence[len]){ 12 i++; 13 } 14 if(i<len){ 15 return false; 16 } 17 len--; 18 19 } 20 return true; 21 }