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

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。

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

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

 

这里首先是以数组 arr[ ] 最后一个数arr[end] 为基准,从begin位置到end位置扫描数组,找到第一个大于基准数的位置pos,在判断区间 arr[pos,end] 是否满足所有的数都大于 arr[end] ,满足则继续判断 arr[begin,pos-1]  和 arr[pos,end-1],如多所有都满足,则能形成二元查找树,反之不能!

 

 

#include <iostream>
using std::cout;
using std::endl;

bool BeTree(int* arr,int begin,int end);	//递归函数,判断是否能形成树
int  findpos(int* arr,int begin,int end);	//寻找第一个大于根节点的位置
bool ifbig(int* arr,int begin,int end);	//比较后面的数是不是都比前面的大

int main()
{
	int scr[4] = {5,8,4,7};
	bool byes ;
	byes = BeTree(scr,0,3);
	if (byes)
		cout<<"可以!";
	else
		cout<<"不可以!"<<endl;
	cout<<endl;

	system("pause");
	return 0;
}

bool BeTree(int* arr,int begin,int end)
{
	if (begin+1>=end)
		return true ;		//如果数组只有一个或是两个数,则一定满足
	else
	{
		int pos = findpos(arr,begin,end);
		bool bTemp = ifbig(arr,pos,end);
		if (bTemp)
		{
			bTemp = BeTree(arr,begin,pos-1);
			bTemp = BeTree(arr,pos,end-1);
		}
		return bTemp ;
	}
}

int findpos(int* arr,int begin,int end)
{
	int i ;
	for (i=begin;i<end;i++)
	{
		if (arr[i]>arr[end])
			break;
	}
	return i;	//返回的是第一个大于根节点的值得位置
}

bool ifbig(int* arr,int begin,int end)
{
	if (end>begin)		//如果右子树只有0个或是1个,则满足
	{
		for (int i=begin;i<end;i++)
		{
			if (arr[i]<arr[end])
				return false;
		}
	}
	return true ;
}


 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值