题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:
二叉搜索树的后序遍历特点:
后序遍历 的序列中,最后一个数字是树的根节点 ,数组中前面的数字可以分为两部分:第一部分是左子树节点 的值,都比根节点的值小;第二部分 是右子树 节点的值,都比 根 节点 的值大,后面用递归分别判断前后两部分 是否 符合以上原则
注意:二叉树可能是只有右子树,只有左子树,对应代码的 start > end.
比如数组 9 7 5 ,此时 i = 0, Is_BST(arr, 0, -1) && Is_BST(arr, 0, 1)
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length == 0) return false;
return Is_BST(sequence, 0 , sequence.length-1);
}
public boolean Is_BST(int[] arr, int start, int end){
// start==end对应的是叶子结点,start>end 对应的是空树
if(start >= end){
return true;
}
//二叉搜索树中,右子树结点的值大于根结点的值
int i = start;
for(i=start; i<end; i++){
if(arr[i] > arr[end]){
break;
}
}
//二叉搜索树中,右子树结点的值大于根结点的值
for(int j=i; j < end; j++){
if(arr[j]< arr[end]){
return false;
}
}
return Is_BST(arr, start, i-1) && Is_BST(arr, i, end-1);
}
}
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length == 0) return false;
return Is_BST(sequence, 0 , sequence.length-1);
}
public boolean Is_BST(int[] arr, int start, int end){
if(start == end){
return true;
}
int root = arr[end];
//二叉搜索树中,右子树结点的值大于根结点的值
int i = start;
for(i=start; i<end; i++){
if(arr[i] > root){
break;
}
}
//二叉搜索树中,右子树结点的值大于根结点的值
for(int j=i; j < end; j++){
if(arr[j]< root){//若存在小于根结点的值,则结束,返回false
return false;
}
}
boolean left = true;
if(i > 0){
left = Is_BST(arr, start, i-1);
}
boolean right = true;
if(i < end){
right = Is_BST(arr, i, end-1);
}
return (left && right);
}
}