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; 
    }
  • 相关阅读:
    SDWebImage源码解读之SDWebImageDownloader
    Swift 中函数使用指南
    SDWebImage源码解读之SDWebImageDownloaderOperation
    Swift enum(枚举)使用范例
    用C语言封装OC对象(耐心阅读,非常重要)
    终端mysql Operation not permitted错误解决方案
    SDWebImage源码解读之SDWebImageCache(下)
    SDWebImage源码解读之SDWebImageCache(上)
    SDWebImage源码解读_之SDWebImageDecoder
    递归的本质
  • 原文地址:https://www.cnblogs.com/tianzeng/p/10193185.html
Copyright © 2011-2022 走看看