难度系数 ⭐⭐⭐难在思路
时间限制 C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
题目内容 输入一个非空整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路 二叉搜索树,即以该树任意节点为根的子树,子树的左子树的数值都比根小,子树的右子树的数值都比根大。这是二叉搜索树的特征。结合后序遍历的特点,则该题解题思路是:数组最后一个数值是树的根节点,前边的数值左边部分属于左子树,且数值小于根节点;右边部分属于右子树,且数值大于根节点。递归判断左子树部分和右子树部分是否都满足上述特征。
package nowcoder;
import java.util.Arrays;
public class No25 {
public static boolean VerifySequenceOfBST(int [] sequence) {
if (sequence.length < 1) return false;
if (sequence.length == 1) return true;
int root = sequence[sequence.length - 1];
int leftLastIndex = 0;
while (sequence[leftLastIndex] < root)
leftLastIndex++;
if (leftLastIndex == sequence.length - 1)
return VerifySequenceOfBST(Arrays.copyOfRange(sequence, 0, leftLastIndex));
int rightLastIndex = leftLastIndex;
while (sequence[rightLastIndex] >= root) {
rightLastIndex++;
if (rightLastIndex == sequence.length - 1)
return VerifySequenceOfBST(Arrays.copyOfRange(sequence, leftLastIndex, rightLastIndex));
}
return false;
}
public static void main(String[] args){
int[] arr = {5,4,3,2,1};
System.out.println(VerifySequenceOfBST(arr));
}
}