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

原题:

 

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。

如果是则返回true,否则返回false。

假设输入的数组的任意两个数字都互不相同。

样例

输入:[4, 8, 6, 12, 16, 14, 10]

输出:true

 

分析:

  二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树

  题目中给出的是二叉树的后序遍历序列,可知最后一个节点为根结点。在根据二叉搜索树的定义,从前往后遍历二叉树的后续遍历序列,第一个大于根结点的节点为分界线,后面的节点构成右子树,前面的结点构成左子树,若右子树中有结点小于根结点,则这不是一个二叉搜索树。

代码:

class Solution {
public:
    //作用:把sequence提成全局变量,递归时少传一个参数
    vector<int> seq;
    bool verifySequenceOfBST(vector<int> sequence) {
        //思路:二叉搜索树的特点每个结点的左子树都小于该结点,每个结点的右子树都大于该结点。
        seq = sequence;
        int root = sequence.size() - 1;
        return dfs(0,root);
    }
    int dfs(int left,int root){
        //递归出口,遍历完当前结点都符合二叉搜索树的性质
        if(left >= root) return true;
        int i=left;
        int root_num = seq[root];
        //找到以root为根的树的左子树
        while(seq[i] < root_num && i < root) i++;
        //判断以root为根的右子树是否都大于根结点,如果不大于则证明不是二叉搜索树
        for(int k = i;k < root ;k++ ){
            if(seq[k] < root_num) return false;
        }
        return dfs(left,i-1) && dfs(i,root-1);
    }
    
};

posted @ 2020-04-24 16:01  毛毛吃火锅不要锅  阅读(205)  评论(0编辑  收藏  举报