前言:
由于过去几个月参与毕业实习的原因,暂时顾不上写博客,今天开始重拾旧事吧。
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
测试用例:
[4,8,6,12,16,14,10]
[1,2,3,4,5]
对应输出应该为:
true
true
分析:左子树一定比右子树小,因此去掉后,数字分队列尾部的root之后数字分为前后两段,左子树(前一段)小于root,而右子树(后半段)大于root才对,因此我们可以每次只看有子树是否符合条件即可。
对于左子树回到了原问题,对于右子树,左子树的所有值都比右子树的根小可以暂时把他看出右子树的左子树
所以只需看看右子树的右子树是否符合要求即可
使用递归的方法思路更加清晰,但是若是将递归转换为循环的话,效率能高一些,而且不会浪费内存。
源码:
递归:
import java.util.ArrayList;
import java.util.Stack;
public class Test1 {
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
int size = sequence.length;
if (size==0) {
return false;
}
return judge(sequence,0,size-1);
}
private boolean judge(int[] sequence, int i, int j) {
if (i==j) {
return true;
}
int m = i;
while(sequence[m++]<sequence[j]&&m<j);
int temp = m;
while(sequence[temp++]>sequence[j]&&temp<j);
if (temp<j) {
return false;
}
if (m==j||m==i) {
return judge(sequence, i, j-1);
}else {
return judge(sequence, i, m-1)&&judge(sequence, m, j-1);
}
return false;
}
}
}
循环:
import java.util.ArrayList;
import java.util.Stack;
public class Test1 {
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
int size = sequence.length;
if (size==0) {
return false;
}
int i = 0;
while(--size!=0){
while(sequence[i++]<sequence[size]);
while(i<size&&sequence[i++]>sequence[size]);
if (i<size) {
return false;
}
i = 0;
}
return true;
}
}
}
运行测试:
递归测试:运行时间:19ms 占用内存:9544k
循环测试:运行时间:16ms 占用内存:8592k
总结:
此题重点考验了对二分查找树(Binary Search Tree)的结构理解。只要晓得了BST的后序序列规则,使用递归的思想很容易就能得到一个解,但是递归效率要低于循环,所以可以想办法将递归转化为循环即可。