23.二叉搜索树的后序遍历序列
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:
二叉搜索树的根节点大于所有左子树结点,小于所有右子树结点,后序遍历的 顺序是 左 -> 右 -> 根, 所以最后的元素是根节点,中间第一个不小于 根节点的元素是右子树的第一个结点,所以据此找到分界点,递归判断左右子树
1 public class Solution { 2 // 二叉搜索树的根节点大于所有左子树结点,小于所有右子树结点, 3 // 后序遍历的 结果是 左 -> 右 -> 根, 所以最后的元素是根节点,中间第一个不小于 根节点的元素是右子树的第一个结点 4 // 找到分界点,递归判断左右子树 5 public boolean VerifySquenceOfBST(int [] sequence) { 6 if(sequence.length == 0) // 如果数组长度为0,直接返回false 7 return false; 8 // 递归判断足有子树 9 return helpVerify(sequence, 0, sequence.length - 1); 10 } 11 12 public boolean helpVerify(int [] sequence, int start, int end){ 13 if(start >= end) 14 return true; 15 // 找到分界点 16 int root = sequence[end]; 17 int split = 0; // 分界点的下标 18 for(; split < end && sequence[split] < root; split++); 19 20 // 判断分结点右边的左右元素是否都大于根节点 21 for(int i = split; i < end; i++){ 22 if(sequence[i] < root){ 23 return false; 24 } 25 } 26 // 递归判断左右子树 27 return helpVerify(sequence, 0, split - 1) && helpVerify(sequence, split, end - 1); 28 } 29 }