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

    0 题目

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

    1 分析

    后序遍历的结果,根节点在最后一个,前面的部分,前一部分是右子树,应该都小于根节点,后一部分是左子树,都大于根节点。

    因此递归处理就可以了

      public:
        bool VerifySquenceOfBST(vector<int> sequence)
        {
            return aux(sequence, 0, sequence.size() - 1);
        }
        bool aux(vector<int> sequence, int begin, int end)
        {
            if (sequence.empty() || begin > end)
            {
                return false;
            }
            int root = sequence[end];
            int i = begin;
    
            // 找到右子树的第一个节点
            for (; i < end; ++i)
            {
                if (sequence[i] > root) //i坐标为右子树第一个节点
                    break;
            }
    
            // 判断右子树是否符合要求
            for (int j = i; j < end; ++j)
            {
                if (sequence[j] < root)
                    return false;
            }
    
            // 递归判断左右子树
            bool left = true;
            if (i > begin)
            {
                left = aux(sequence, begin, i - 1);
            }
    
            bool right = true;
            if (i < end - 1)
            {
                right = aux(sequence, i, end - 1);
            }
            return left && right;
        }
    

      

    或是更改一下判断顺序

    bool VerifySquenceOfBST(vector<int> sequence)
    {
        return aux(sequence, 0, sequence.size() - 1);
    }
    bool aux(vector<int> sequence, int begin, int end)
    {
        if (sequence.empty())
        {
            return false;
        }
        if (begin >= end)
        {
            return true;
        }
        int root = sequence[end];
        int i = begin;
        for (; i < end; ++i)
        {
            if (sequence[i] > root) //i坐标为右子树第一个节点
                break;
        }
    
        for (int j = i; j < end; ++j)
        {
            if (sequence[j] < root)
                return false;
        }
    
        bool left = true;
        left = aux(sequence, begin, i - 1);
    
        bool right = true;
        right = aux(sequence, i, end - 1);
        return left && right;
    }
    

      

  • 相关阅读:
    C#基础
    自动化测试
    C# 数据结构题目
    .NET基础知识
    Sharepoint题目
    题目总结2
    数据库索引
    题目总结(2014-1-10)
    Stack详解
    SpringBoot入门基础知识点
  • 原文地址:https://www.cnblogs.com/perfy576/p/8608041.html
Copyright © 2011-2022 走看看