题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:首先,对二叉搜索树不熟悉,所以首先百度这个树有什么性质。性质:二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。可知,二叉搜索树就是左子树要小于根节点,右子树要大于根节点。它有可能是空树(有待考察),我根据定义认为空树也是二叉搜索树。但经过我写完代码提交发现空树的时候应该返回false,不知道是不是平台测试数据有误,还是我对题目理解有错,先放在这里,如果大佬知道why,可以写评论。我下面思路和代码都是当为空树的时候返回false的。分治思路。
1、确定根节点:根据后序遍历的方法可知,根节点是序列的最后一个元素。
2、找到第一个大于根节点的第一个元素,该元素的左边是左子树,右边是右子树。
3、然后遍历左子树是否都小于根节点,如果有大于就返回false,遍历右子树是否都大于根节点如果有小于就返回false;
4、然后分别遍历左子树和右子树是不是二叉搜索树。(即递归)由于java不好从数组里面割除一些元素到新数组,所以我设了一个新的函数,方便递归使用。js代码用了slice函数,可以提取元素到新数组,所以我就在原函数中递归。
代码一:java
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
int len=sequence.length;
if(len==0)
return false;
if(len==1||len==2)
return true;
int i=0;
int y=-2;
for(i=0;i<len;i++){
if(sequence[i]>sequence[len-1]){
y=i;
break;
}
}
if(y<0)
return true;
for(i=0;i<y;i++){
if(sequence[i]>=sequence[len-1])
return false;
}
for(i=y+1;i<len-1;i++){
if(sequence[i]<=sequence[len-1])
return false;
}
return judge(sequence,0,y-1)&&judge(sequence,y,len-2);
}
public boolean judge(int []seq,int start,int end){
if(start<0||end<0)
return true;
if(start>=end)
return true;
if(end-start==1)
return true;
int i=start;
int y=-1;
for(;i<end;i++){
if(seq[i]>seq[end]){
y=i;
break;
}
}
for(i=start;i<y;i++){
if(seq[i]>=seq[end])
return false;
}
for(i=y+1;i<end;i++){
if(seq[i]<=seq[end])
return false;
}
return judge(seq,start,y-1)&&judge(seq,y,end-1);
}
}
js:
function VerifySquenceOfBST(sequence)
{
var len=sequence.length;
if(len==0)
return false;
if(len==1||len==2)
return true;
var i=0;
var y=-2;
for(i=0;i<len;i++){
if(sequence[i]>sequence[len-1]){
y=i;
break;
}
}
if(y<0)
return true;
for(i=0;i<y;i++){
if(sequence[i]>=sequence[len-1])
return false;
}
for(i=y+1;i<len-1;i++){
if(sequence[i]<=sequence[len-1])
return false;
}
if(y==0)
return true;
return VerifySquenceOfBST(sequence.slice(0,y))&&VerifySquenceOfBST(sequence.slice(y,len-1));
// write code here
}