剑指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     }

 

posted @ 2019-04-12 10:40  月半榨菜  阅读(80)  评论(0编辑  收藏  举报