输入一个整数数组,判断该数组是否是某二叉搜索树的后序遍历的结果。若是是则输出Yes,不然输出No。假设输入的数组的任意两个数字都互不相同。编程
二叉树的后序遍历也就是先访问左子树,再访问右子树,最后访问根节点,因此不难发现,所给的数组最后一个元素必定是二叉搜索树的根节点,而若是数组是二叉搜索树的后续遍历的话,就必定会根据数值划分两部分,左边是根节点的左子树,剩下的部分则是根节点的右子树。左子树的数值均小于根节点,右子树的数值均大于根节点。数组
例如{5,7,6,9,11,10,8},8是二叉搜索树的根节点,{5,7,6}是左子树,{9,11,10}是右子树。再递归判断。spa
6是根节点,5是左子树,7是右子树,因为只剩一个元素了,判断停止,同理{9,11,10}也是如此。code
但若是不是后序遍历的序列,如{7,4,6,5}blog
5是根节点,7,4,6三个元素没有办法划分出左右子树,由于二叉搜索树的特性咱们知道,左子树全部元素的值都小于根节点,右子树的值均大于根节点,不管是{7},{4,6}仍是{7,4},{6}均不符合二叉搜索树的性质,在编程实现的过程当中,咱们能够遍历数组,当出现第一个大于根节点的元素时,便认为以前的全部元素时这个根节点的左子树,而排除最后一个元素剩下的全部元素即是右子树,查看右子树中的元素若是有小于根节点的元素,即可以直接判断不是二叉搜索树的后续遍历,若是没有就递归执行下去。递归
C++io
class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.size() == 0) return false; return helper(sequence, 0, sequence.size()); } bool helper(vector<int> &v, int index, int length){ if(length <= 1) return true; int i = 0; for(; i < length-1; ++i){ if(v[index + i] > v[index + length -1]) break; } for(int j = i; j < length-1; ++j){ if(v[index + j] < v[index + length -1]) return false; } return helper(v, index, i) && helper(v, index+i, length-i-1); } };
Javaclass
public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if(sequence.length == 0) return false; return helper(sequence, 0, sequence.length); } public boolean helper(int [] sequence, int index, int length){ if(length <= 1) return true; //找到第一个大于根节点的元素偏移量,此元素右侧序列为右子树(包括) int i = 0; for(; i < length - 1; ++i){ if(sequence[index + i] > sequence[index + length -1]) break; } //检查右子树元素是否都大于根节点 for(int j = i; j < length - 1; ++j){ if(sequence[index + j] < sequence[index + length -1]) return false; } return helper(sequence, index, i) && helper(sequence, index+i, length-i-1); } }