• 【剑指Offer-举例让抽象问题具体化】面试题33:二叉树的后序遍历序列


    题目描述

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

    思路

    二叉排序树:左子树的节点值均小于根结点,右子树的节点值均大于根结点;或者是一棵空树。二叉排序树的后序遍历序列的最后一个值为根结点的值,根据根结点可以将序列分为两部分,一部分小于根结点的值,对应左子树,另一部分大于根结点的值,对应右子树。对于左右子树使用同样的方法递归判断即可。如果不能将整个序列分成这样的两个子序列,则该序列不是平衡二叉树的后序遍历结果。对应代码如下:

    class Solution {
    public:
        bool VerifySquenceOfBST(vector<int> sequence) {
            if(sequence.empty())
                return false;
            
            int sep = 0;    //左右子树的分割点
            int root = sequence[sequence.size()-1];
            while(sequence[sep]<root && sep<sequence.size()-1)     //注意终止条件是sep<sequence.size()-1
                sep++;
            
            for(int i=sep; i<sequence.size()-1; i++)    //注意终止条件是sep<sequence.size()-1
                if(sequence[i]<root)
                    return false;
            
            bool left=true;
            if(sep>0){
                vector<int> leftSequence;
                for(int i=0; i<sep; i++)
                    leftSequence.push_back(sequence[i]);
                left = VerifySquenceOfBST(leftSequence);
            }
            
            bool right=true;
            if(sep<sequence.size()-1){
                vector<int> rightSequence;
                for(int i=sep; i<sequence.size()-1; i++)     //注意终止条件是sep<sequence.size()-1
                    rightSequence.push_back(sequence[i]);
                right = VerifySquenceOfBST(rightSequence);
            }
            
            return left&&right;
        }
    };
    
  • 相关阅读:
    hdu--1253--胜利大逃亡(bfs)
    zzuli--2134: 维克兹的进制转换(规律)
    hdu--1316--How Many Fibs?(java大数)
    NYOJ--517--最小公倍数(大数打表)
    NYOJ--513--A+B Problem IV(大数)
    flask 重写wsgi_app实现自定义中间件
    flask的异常处理(errorhandler),template_global,以及过滤(template_filter)
    flask 的before_request以及after_request
    flask的闪现
    flask的session
  • 原文地址:https://www.cnblogs.com/flix/p/12467715.html
Copyright © 2020-2023  润新知