zoukankan      html  css  js  c++  java
  • 9.判断1个整数序列是不是二叉查找树的后续遍历结果

    题目: 输入整数序列,判断该数组是不是某个二叉查找树的后续遍历结果,是返回true,不是返回false.

    解: 二叉查找树中有左孩子<=父节点<右孩子,所以如果1个序列是2叉查找树的后续遍历结果的话,那么最后1个元素就是根,以数组5,7,6,9,11,10,8说明,假设它是的话,那么8就是这棵树的根,从头开始遍历直到>8的元素为止,前面的元素都属于左孩子,后面的元素除了末尾都属于右孩子,因为这是我们已经判断左孩子的节点都<=8,那么就在右孩子中遍历,如果元素有小于8的,就不满足二叉查找树性质,返回false了;如果都>8,那么继续判断左孩子和右孩子是不是二叉查找树的后续遍历,当且仅当左右孩子都是时,那么这个数组序列就返回true,否则返回false

    代码:

    #include<iostream>
    using namespace std;
    
    //判断a[begin]->a[end]是不是
    bool isbt(int* a,int begin,int end)
    {
        //单节点是的
        if(begin>=end)
            return true;
        else if(begin<end)
        {
            int root=a[end];
            int i,j,p=begin;
            for(i=begin;i<end;)
                if(a[i]<=root)
                    i++;
                else //a[i]>root即到右子树的第一个节点
                    break;
    
            p=i;
            //现在判断右子树的节点是不是都>root,如果不是的话,那么直接不是2叉查找数,如果是的话,看左右孩子
            bool isnot=false;
            for(j=i;j<end;j++)
                if(a[j]<root)
                    isnot=true;
            //如果正是不是
            if(isnot)
                return false;
    
            //下面看左右孩子是不是了
            bool leftis=isbt(a,begin,p-1);
            bool rightis=isbt(a,p,end-1);
            //如果左右孩子都是
            if(leftis && rightis)
                return true;
            else
                return false;
        }
    }
    
    
    int main(void)
    {
        int a[]={5,7,6,9,11,10,8};
        int b[]={7,4,6,5};
    
        //bool flag=isbt(a,0,6);
        bool flag=isbt(b,0,3);
        if(flag)
            cout<<""<<endl;
        else
            cout<<"不是"<<endl;
        return 0;
    }
  • 相关阅读:
    委托学习小记(1)
    C# 对XML的 创建、查询
    C#多线程学习(六) 互斥对象
    C#多线程学习(二) 如何操纵一个线程
    C#多线程学习(四) 多线程的自动管理(线程池)
    16/11/22_plsql
    写日志
    内存检测
    开源
    vs2005 远程调试。
  • 原文地址:https://www.cnblogs.com/buxianghe/p/3203048.html
Copyright © 2011-2022 走看看