判断整数序列是不是二元查找树的后序遍历结果(9)

本文介绍了一个算法,用于判断给定的整数序列是否为某个二叉查找树的后序遍历结果。通过递归方法检查序列是否符合二叉查找树的性质,并提供了一个具体的实现案例。
第9题
判断整数序列是不是二元查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。

例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:

         8
      /  \
     6    10
    / \  / \
   5  7 9  11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。

 

 

/*
  Name: 
  Copyright: 
  Author: 
  Date: 22-06-11 10:52
  Description: 判断整数序列是不是二元查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的中序遍历的结果。
如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
      8
     / \
    6  10
   /\  /\
  5 7 9 11
因此返回true。
采用递归; 
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
*/
#include<iostream>
#include<iomanip>
using namespace std;

bool cfun(int a[],int p,int r)
//a 为数组,假设下标从零开始
{
    bool ret=false;
    const int len=r-p+1;
    if(p==r)
    {
    return true;
    }
    else
    {   
        bool b;
        for(int i=p;i<=r;++i)
        {
                b=true;
                for(int j=i+1;j<=r;++j)
                {
                   if(a[j]<a[i])
                   {
                      b=false;
                      break;
                   }
                }
                if(b)
                {
                     for(int j=p;j<i;++j)
                     {
                        if(a[j]>a[i])
                        {
                           b=false;
                           break;
                        }
                     }
                }
                if(b)
                {
                     if(i==p)
                     ret=cfun(a,i+1,r);
                     else
                        {
                           if(i==r)
                             ret=cfun(a,p,i-1);
                             else
                             ret=cfun(a,p,i-1)&&cfun(a,i+1,r);
                        }
                if(ret)
                return true;     
                }
                
        }
    return false;
    } 
}

int main()
{
    int a[]={7,4,6,5};
    bool b=cfun(a,0,3);
    if(b)
    cout<<"true";
    else
    cout<<"false";
    cout<<endl;
    system("pause");
    exit(0);
    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值