剑指Offer- 23 - 二叉搜索树的后序遍历序列 - C++/Java

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树(二叉排序树)的后序遍历的结果。如果是则输出Yes,否则输出No。
假设输入的数组的任意两个数字都互不相同。

解题思路

后序遍历:左——右——根 ,且 左 < 根 < 右
突破口:后序遍历到的最后一个结点就是根节点,之前遍历到的结点小于根结点则为左子树,大于根节点则为右子树

思路:
1、确定root;
2、遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树;
3、遍历右子树,若发现有小于root的值,则直接返回false;
4、分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)。

具体代码

• C++

public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(!sequence.size())
            return false;
        return judge(sequence,0,sequence.size()-1);
    }
    
    // 判断是否为二叉排序树
    // start表示数组起始位,end表示数组终点位
    bool judge(vector<int> &sequence, int start, int end){
        if(start >= end)
            return true;
        
        int pivot; //第一个大于根节点的位置
        for(pivot = start; sequence[pivot] < sequence[end]; pivot ++); //查找分界点
        for(int i = pivot; i<=end; i++)
            // 若该分界点的右边有小于根结点的数,false
            if(sequence[i] < sequence[end])
                return false;
        return judge(sequence,start,pivot-1) && judge(sequence,pivot,end-1);
                
    }
};

• Java

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length <= 0)
            return false;
        return judge(sequence,0,sequence.length-1);
    }
    
    public boolean judge(int [] sequence,int start,int end){
        if(start>=end)
            return true;
        
        int pivot;
        for(pivot = start; sequence[pivot] < sequence[end]; pivot++); //查找分界点
        for(int i = pivot; i <= end; i++)
            if(sequence[i] < sequence[end])
                return false;
        return judge(sequence,start,pivot-1) && judge(sequence,pivot,end-1);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章