• 剑指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;
    }
    

      

  • 相关阅读:
    [转载]数据库外键的使用
    [转载]我如何筛选简历与选择人员
    [转载]asp.net中使用Row_Number函数分页
    五一,给心情放个假酷狗电台桌面版
    win32建立弹出式菜单
    GetMessage用法错误导致程序不能退出
    win32在程序当中引用菜单
    WM_COMMAND和WM_KEYDOWN消息的wParam,lParam参数
    单链表的释放内存free(delete)的顺序
    win32 GetMenu()和GetSubMenu()
  • 原文地址:https://www.cnblogs.com/perfy576/p/8608041.html
Copyright © 2020-2023  润新知