题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:二叉搜索树即根节点比左子树的所有节点的值都大,并且比右子树左右结点的值都小,又因为数组要判断数组是不是二叉树的后续遍历序列,假设该序列是二叉搜索树的后序遍历序列,那么序列的最后一个元素一定是根节点,到这里,我们的解题思路如下: 首先,从第一个元素开始起,找到第一个比最后元素大的元素位置p,则该位置之前的元素全是根节点的左节点的值, 然后,再判断从当前位置p起,一直到根节点,有没有比根节点小的节点存在,如果有,则不满足二叉搜索树的条件,如果没有,则将p前后的节点分成两颗子树再进行递归。
import java.util.Arrays; public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if (sepuence == null || sepuence.length == 0) return false; int i = 0; for (; i < sequence.length; i++){ if (sequence[i] > sequence[sequence.length - 1]) break; } int p = i; for (; p < sequence.length; p++){ if (sequence[p] < sequence[sequence.length - 1]) return false; } boolean left = true; boolean right = true; if (i > 0 && i < sequence.length - 1){ left = VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, i); right = VerifySquenceOfBST(Arrays.copyOfRange(sequence, i, sequence.length - 1); } return left && right; } }