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

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

    例如输入数组{5,7,6,9,11,10,8},则返回true,如果输入的数组是{7,4,6,5},则返回false。

    思路:

    因为该序列的最后一位肯定是二叉搜索树的根结点,并且前面的序列为根结点的左子树,比根结点小,后面的序列为根结点的右子树,比根结点大。

    所以可以从头遍历该序列直到找到比根结点大的下标,然后从该下标开始遍历到length-1,如果有一个数比根结点小则返回false,如果都比根结点大则递归判断左右子树,左右子树都符合条件才返回true;

    代码如下:

    #include<iostream>
    using namespace std;
    bool isorder(int *data,int length)
    {
        //判断边界条件
        if(data==NULL||length<=0)
        {
            return false;
        }
        //保存根节点值
        int root=data[length-1];
        //找到第一个大于根节点的值,往后的值都大于根节点,否则返回false
        int i=0;
        for(;i<length-1;i++)
        {
            if(root<data[i])
                break;
        }
        for(int j=i+1;j<length-1;j++)
        {
            //如果i之后的数字有一个小于根节点,则不满足后序遍历,返回false
            if(data[j]<root)
                return false;
        }
        //如果存在左子树,则递归判断左子树
        bool left=true;
        if(i>0)
        {
            left=isorder(data,i);
        }
        //如果存在右子树,递归判断右子树
        bool right=true;
        if(i<length-1)
        {
            right=isorder(data+i,length-i-1);
        }
        return left&&right;
    }

    测试代码及运行结果:

    int main()
    {
        int data[]={5,7,6,9,11,10,8};
        cout<<"是否是二叉搜索树的后序遍历:"<<(isorder(data,7)?"true":"false")<<endl;
        return 0;
    }

  • 相关阅读:
    SpringCloudStream实例
    Gateway环境搭建,通过YML文件配置
    Hystrix图形化监控
    Hystrix服务降级
    SpringBootのRedis
    springboot之缓存
    springboot整合JPA
    留言板
    Python 京东口罩监控+抢购
    2019年 自我总结
  • 原文地址:https://www.cnblogs.com/runninglzw/p/4603286.html
Copyright © 2011-2022 走看看