题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路(递归):
后序遍历 的序列中,最后一个数字是树的根节点 ,数组中前面的数字可以分为两部分:第一部分是左子树节点 的值,都比根节点的值小;第二部分 是右子树 节点的值,都比 根 节点 的值大,后面用递归分别判断前后两部分 是否 符合以上原则.
public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if(sequence==null||sequence.length<=0) return false; return jude(sequence,0,sequence.length-1); } public boolean jude(int[] sequence,int start,int end){ if(start>=end) return true;//要处理的数据只有一个或者已经没有数据要处理 // 从左向右找第一个不小于根结点(sequence[end])的元素的位置 int index=start; while((index<end-1)&&(sequence[end]>sequence[index])) index++; int right=index; //到这 [start,index-1]<[end] //保证[index, end-1]的所有元素都是大于根根点的值 while(index<end-1&&sequence[end]<sequence[index]) index++; if(index!=end-1) return false; index=right; return jude(sequence,start,index-1)&&jude(sequence,index,end-1); } }
递归方法的时间复杂度:
以标准的完美二叉搜索树为例,递归的每一层都涉及到对序列的遍历,虽然层数越深节点越少(少了子树的根节点),但是这种减少是微不足道的,即使是到了最底层,依旧有n/2的节点(完美二叉树第i层节点数是其上所有节点数之和+1),因此递归方法在每一层的遍历开销是O(n),而对于二叉树而言,递归的层数平均是O(logn),因此,递归方法的最终复杂度是O(nlogn)