zoukankan      html  css  js  c++  java
  • 剑指offer:二叉搜索树的后续遍历序列

    题目描述:

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

    解题思路:

    根据二叉搜索的性质,后序遍历是先搜索左子树,再右子数,最后是根结点。对应到序列中就是,序列的最后一位为根结点,从头开始遍历序列中一段连续子序列小于根结点,为左子树,后一段连续子序列大于根结点,为右子树。

    举个例子,序列为(2,4,3,6,7,5),则5为根结点,对应(2,4,3)都小于5,为左子树,(6,7)大于5,为右子树。再对每个子树递归。

    注意,对于初试为空的序列,返回的结果应该是false。因此在递归过程中遇到空的子序列,需要多一个判断。或是重写一个递归函数,递归函数中的空序列返回true,而原函数中的空序列单独判断。

    代码:

    class Solution {
    public:
        bool VerifySquenceOfBST(vector<int> sequence) {
            if(sequence.size()==0)
                return false;
            if(sequence.size()==1)
                return true;
            vector<int> left;
            vector<int> right;
            int root = sequence[sequence.size()-1];
            int i;
            for(i = 0; i<(sequence.size()-1); i++)
            {
                if(sequence[i]<root)
                    left.push_back(sequence[i]);
                else
                    break;
            }
            for(i = i+1; i<(sequence.size()-1); i++)
            {
                if(sequence[i]>root)
                    right.push_back(sequence[i]);
                else
                    return false;
            }
            if(left.size()==0 && right.size()==0)
                return true;
            if(left.size()==0 && VerifySquenceOfBST(right))
                return true;
            if(right.size()==0 && VerifySquenceOfBST(left))
                return true;
            if(VerifySquenceOfBST(left) && VerifySquenceOfBST(right))
                return true;
            else
                return false;
        }
    };
  • 相关阅读:
    Oracle学习 第29天 存储过程生成报表
    Oracle学习 第28天 存储过程输出结果集
    Python学习 第9天 连接FTP和数据库
    Bat脚本学习-6:Oracle自动备份还原脚本
    Bat脚本学习-5:Oracle自动备份还原脚本
    Bat脚本学习-4:Oracle自动备份还原脚本
    Vue学习 第2天 又看了个教程,加深理解
    Vue学习 第1天 初始Vue及MVVM
    下半年加油,好久没上来冒个泡了
    Python学习 第8天 打包exe
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/10604222.html
Copyright © 2011-2022 走看看