树9:二叉搜索树的后序遍历

题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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)

原文地址:https://www.cnblogs.com/xuechengmeigui/p/12988827.html