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;
        }
    };
    
  • 相关阅读:
    规约先行-(六)并发处理
    MySQL选择合适的方式存储时间
    规约先行-(五)集合处理
    规约先行-(四)OOP 规约
    12.20-LaTex git workflow
    6.25-ROS 软件度量
    6.19-rosdoc_lite and 文档构建工具
    12.27-ros-decision making
    12.3-分级并发有限状态机-SMACH
    12.07-rostest学习
  • 原文地址:https://www.cnblogs.com/flix/p/12467715.html
Copyright © 2011-2022 走看看