zoukankan      html  css  js  c++  java
  • 【剑指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;
        }
    };
    
  • 相关阅读:
    国外大学公开课
    普瑞马法则
    在一个整数区间里产生一组不重复的随机数
    arm架构下树莓派 运行javafx流程
    Windows 如何在cmd命令行中查看、修改、删除与添加环境变量
    我来了!
    IIS替代方案:Visual Studio自带的WebServer
    网络收藏夹DEMO
    Web收藏夹
    LazyGuy的BLOG搬迁至CNBLOGS
  • 原文地址:https://www.cnblogs.com/flix/p/12467715.html
Copyright © 2011-2022 走看看