剑指offer面试题之判断二叉搜索树的后序序列

来源:互联网 发布:nginx和zookeeper 编辑:程序博客网 时间:2024/06/05 11:56

1,问题:

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

2,想法:

后序序列的最后一个结点为根节点,根节点的左孩子树都比它小,右孩子树都比它大,所以可以根据最后一个结点把序列分成两个部分,分成两个部分后又可以继续递归判断。而递归的出口是,当递归到序列中只有一个孩子时,返回true,当当前根节点不能把当前序列分成两个部分时,就返回false。

3,编码:

class Solution {public:    bool isBST(vector<int> s, int start, int end)    {        if (start == end)//序列只有一个孩子时        {            return true;        }        int i;        //下边两个for循环既可以判断当前的根能否完整的把序列分成两个左右孩子序列        //从而判断是否是后序序列        //又能找到下层递归的起始位置        for (i = start; i < end;)        {            if (s[i] < s[end])                i++;            else                break;        }        for (i; i < end;)        {            if (s[i] > s[end])                i++;            else                break;        }        if (i < end)//这里判断是否在找到第一个大于根的节点后,序列中又有小于根的节点        {           //若有则i不回增加到end,就不是一个后序序列            return false;        }        if (i - start == 0)//说明当前后序序列代表的树没有左孩子        {            return isBST(s, start, end - 1);        }        else if (i == end)//表示没有右孩子        {            return isBST(s, start, end - 1);        }        else        {            return isBST(s, start, i - 1) && isBST(s, i, end - 1);         }    }    bool VerifySquenceOfBST(vector<int> sequence) {        if (sequence.empty())        {            return false;        }        return isBST(sequence, 0, sequence.size() - 1);    }};


1 0