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;
    }

  • 相关阅读:
    backtrace、backtrace_symbols、backtrace_symbols_fd-support for application self-debugging
    基于linux与busybox的reboot命令流程分析
    Ubuntu Linux 查看、编辑、比较二进制文件
    SecureCRT中的vim出现1H特殊字符
    单例模式和静态方法
    linux ls命令按时间显示文件
    Shallow Heap & Retained Heap
    jedis连接池的参数配置
    jvm参数设置和性能调优
    并发和并行的区别
  • 原文地址:https://www.cnblogs.com/runninglzw/p/4603286.html
Copyright © 2011-2022 走看看