题解 | #二叉搜索树的后序遍历序列#

二叉搜索树的后序遍历序列

http://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd

递归与非递归

递归

后续遍历最后一位肯定是中间值,根据这个值把数组划为两半,左边肯定是左子树,都得小于中间值,右边是右子树,都得大于中间值。然后看左右字数各自也得满足上述规律。因为分割后左右子树为空也是满足条件的,但是题目说空的不是搜索树,所以要单独再写一个回溯函数。
使用下标作为传递的参数可以减少vector的添加操作,节省时间(下方未使用)
使用一个成员变量来存数组配合传参下标可以进一步节省内存(下方未使用)

class Solution {
public:
    //bool backtra()
    bool backtra(vector<int> sequence) {
        if(sequence.size()<=1) return true;
        int root=sequence.back();
        vector<int> left;
        vector<int> right;
        int i=0;
        for(;i<sequence.size()-1&&sequence[i]<root;i++){
            left.push_back(sequence[i]);
        }
        for(;i<sequence.size()-1;i++){
            if(sequence[i]<=root) return false;
            right.push_back(sequence[i]);
        }
        return backtra(left)&&backtra(right);
    }
    bool VerifySquenceOfBST(vector<int> sequence){
        if(sequence.size()==0) return false;
        if(sequence.size()==1) return true;
        return backtra(sequence);
    }
};

非递归法

这个方法在评论区看的,但是直接用那个有点小问题

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        int size = sequence.size();
        if(0==size)return false;

        int i = 0;
        while(--size){
            while(sequence[i]<sequence[size]) i++;
            while(sequence[i]>sequence[size]) i++;
            if(i<size)return false;
            i=0;
        }

        return true;
    }
};

解释:最后一个是中间值,但是我们去掉最后一个,新的最后一个同样也满足我们说的规律!很有意思~所以就不需要递归,直接while就好了

全部评论

相关推荐

纸鹰:对他说:“你好,我是百度JAVA。”
点赞 评论 收藏
分享
数学转码崽:一直给我推,投了又不理,理了又秒挂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务