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

来源:互联网 发布:淘宝买iphonex靠谱吗 编辑:程序博客网 时间:2024/05/17 06:39

题目描述

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

//后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。
//则根据这个元素,将前面的数组分为左、右两个部分,左侧部分都比root小,右侧部分都比root大,
//如果右侧部分有比该根节点小的元素,那么就不是后序遍历,如此递归进行

class Solution {public:    bool VerifySquenceOfBST(vector<int> sequence) {        int size = sequence.size();        //空树也是二叉搜索树,但是系统规定了空树不为二叉搜索树……        if(size == 0)            return false;        return islastorder(sequence, 0, size-1);    }    bool islastorder(vector<int> a, int l, int r){        //遍历完数组的一部分没报错,返回true        if(l >= r)            return true;        int i = l;//判断根节点以前的数        //i从后往前走,找到第一个比根节点小的数        //while循环结束后,i中保存的是左子树的最后一个数        while(i < r && a[i]<a[r]) i++;        //依次判断i以前的所有数,是否都小于根节点        //若有大于根节点的数,返回false        for(int j = i; j <= r-1; j++){            if(a[j] < a[r])                return false;        }        //对于左子树和右子树分别递归调用函数,进行判断        return islastorder(a, l, i-1)&& islastorder(a, i, r-1);    }};

思路2:

如果左侧部分有比根节点大的数,则不是后序序列

class Solution {public:    bool VerifySquenceOfBST(vector<int> sequence) {        int size = sequence.size();        //空树也是二叉搜索树,但是系统规定了空树不为二叉搜索树……        if(size == 0)            return false;        return islastorder(sequence, 0, size-1);    }    bool islastorder(vector<int> a, int l, int r){        //遍历完数组的一部分没报错,返回true        if(l >= r)            return true;        int i = r-1;//判断根节点以前的数        //i从后往前走,找到第一个比根节点小的数        //while循环结束后,i中保存的是左子树的最后一个数        while(i >= l && a[i]>a[r]) i--;        //依次判断i以前的所有数,是否都小于根节点        //若有大于根节点的数,返回false        for(int j = l; j <= i; j++){            if(a[j] > a[r])                return false;        }        //对于左子树和右子树分别递归调用函数,进行判断        return islastorder(a, l, i)&& islastorder(a, i+1, r-1);    }};












原创粉丝点击