判断一个序列是否是BST的后序遍历结果,假设没有重复元素

#include<iostream>
using namespace std;

bool recur( int a[] , int start , int end ) {
	if( start <= end ) {
		int mid;
		int i = end - 1;
		bool flag = true;
		//从左向右,找到[start,end)区间第一个比a[end]大的元素
		for( i = start ; i < end ; i ++ ) {
			if( a[ i ] > a[ end ] ) {
				break;
			}
		}
		mid = i;
		for( i = mid ; i < end ; i ++ ) {
			if( a[ i ] < a[ end ] ) {
				return false;
			}
		}
		return( recur( a , start , mid - 1 ) && ( a , mid , end - 1 ) );
	}
	return true;
}

int main() {
	//简化一下程序,首先输入这个序列的长度,为了避免串操作
	int length;
	int a[ 100 ];
	int i;
	bool flag;
	scanf( "%d" , & length );
	for( i = 0 ; i < length ; ++ i ) {
		scanf( "%d" , & a[ i ] );
	}
	flag = recur( a , 0 , length - 1 );
	if( flag ){
		printf( "yes\n" );
	}
	else {
		printf( "no\n" );
	}
	return 1;
}
/*
7
5 7 6 9 11 10 8
4
7 4 6 5
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值