zoukankan      html  css  js  c++  java
  • 二叉搜索树的后序遍历序列 【微软面试100题 第九题】

    题目要求:

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

      例如输入数组{5,7,6,9,11,10,8},则返回true,因为这个证书序列时某一二叉搜索树的后序遍历结果。如果输入的数组是{7,4,6,5},由于没有哪棵二叉搜索树的后序遍历的结果是这个序列,因此返回false。

          8

         /    

        6         10

       /        /    

      5       7   9       11          后序遍历序列5,7,6,9,11,10,8对应的二叉搜索树

    参考资料:剑指offer第24题

    题目分析:

      1.二叉搜索树:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树

      2.后序遍历:左+右+根

      3.解决思路:假设数组有n个元素,取数组的最后一个元素a[n-1],把前n-1个元素分成左右两部分,左部分小于a[n-1],右部分大于a[n-1](可以左部分没有或者右部分没有).然后左部分和右部分分别用此思路递归的处理。如果中途出现不能分成左右部分的情况,则说明该数组不是后序遍历结果。

       如{5,7,6,9,11,10,8},取最后一个元素8,可以分成左部分{5,7},右部分{9,11,10}。

       但是{7,4,6,5},取最后一个元素5,因为7>5,则如果可以划分的话,7后面的元素都应该大于5,但是4<5,即该数组不是某二叉搜索树的后序遍历结果。

    代码:

    #include <iostream>
    
    using namespace std;
    
    bool verify(int *a,int len);
    
    int main(void)
    {
    //    int a[] = {5,7,6,9,11,10,8};
        int a[] = {7,4,6,5};
        int len = sizeof(a)/sizeof(int);
        if(verify(a,len))
            cout << "该数组是某二叉搜索树的后序遍历序列" << endl;
        else
            cout << "该数组不是任何二叉搜索树的后序遍历序列" << endl;
        return 0;
    }
    bool verify(int *a,int len)
    {
        if(a==NULL || len<=0)
            return false;
    
        int root = a[len-1];
    
        //在二叉搜索树中左子树的结点小于根结点
        int i = 0;
        for(;i<len-1;i++)
        {
            if(a[i]>root)
                break;
        }
        //在二叉搜索树中右子树的结点大于根结点
        int j = i;
        for(;j<len-1;j++)
        {
            if(a[j]<root)
                return false;
        }
        //判断左子树是不是二叉搜索树
        bool left = true;
        if(i>0)
            left = verify(a,i);
        //判断右子树是不是二叉搜索树
        bool right = true;
        if(i<len-1)
            right = verify(a+i,len-i-1);
    
        return left&&right;
    }
    View Code
  • 相关阅读:
    配置Python3 Pip3环境变量
    超级搜索术-读书笔记
    技术笔记-图片管理器
    Python不错的资料、网站
    输入法9键 VS 26键,哪个更适合?
    超级搜索术-思维导图
    Linux知识-Docker
    Python知识体系-基础知识03-函数/类/模块
    js基础(BOM对象)
    js基础(事件)
  • 原文地址:https://www.cnblogs.com/tractorman/p/4054959.html
Copyright © 2011-2022 走看看