zoukankan      html  css  js  c++  java
  • 二叉搜索树的后序遍历序列

    题目

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

    二叉搜索树

    二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

    1. 若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值
    2. 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值
    3. 左、右子树也分别为二叉排序树

            特点:左子树结点的值都小于根节点的值,右子树结点的值都大于根节点的值

    思路

      序列最后一个值是根结点,根据根结点将序列剩余部分划分为两个部分,左子树部分比根节点的值都小,右子树部分比根节点的值都大。

    拓展

      如果需要处理一棵二叉树的遍历序列,则可以先找到二叉树的根节点,再根据根节点把整棵树的遍历序列拆分成左子树对应的序列和右子树对应的序列,接下来递归处理这两棵子树。

    #include <iostream> 
    #include <vector>
    #include <cstring>
    using namespace std;
    
    class Solution
    {
        public:
            bool is_bst(vector<int> &v,int beg,int end);
    };
    bool Solution::is_bst(vector<int> &v,int beg,int end) 
    {
        if(v.empty()||beg>end)
            return false;
        
        int root=v[end];
    
        //划分二叉搜索树的左子树,找到该序列中第一个大于根节点的结点 
        int i=beg;
        for(;i<end;++i)
            if(v[i]>root)//
                break;
        
        //判断二叉搜索树的右子树有没有小于根节点的结点 
        int j=i;
        for(;j<end;++j)
            if(v[j]<root)//如果右子树有小于根节点的值,则该序列不是二叉搜索树 
                return false;
        
        bool left=true;
        if(i>beg)
            left=is_bst(v,beg,i-1);
        
        bool right=true;
        if(i<end-1)
            right=is_bst(v,i,end-1);
        
        return left&&right;
    }
    int main()
    {
        vector<int> v{5,7,6,9,11,10,8};
        Solution s;
        cout<<boolalpha<<s.is_bst(v,0,v.size()-1)<<endl;
        return 0; 
    }
  • 相关阅读:
    SecureCRT 连接 虚拟机Linux 命令
    如何使用secureCRT连接vmware中的虚拟主机?
    SecureCRT8.1+SecureCRT_keygen完成注册
    常用python机器学习库总结
    Torch7在Ubuntu下的安装与配置
    朴素贝叶斯算法 & 应用实例
    编写MR代码中,JAVA注意事项
    march.
    Docker CentOS 7.2镜像systemd问题解决办法
    Docker 基础命令 简要入门
  • 原文地址:https://www.cnblogs.com/tianzeng/p/10193185.html
Copyright © 2011-2022 走看看