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

本文介绍如何通过检查整数序列来判断其是否为二元查找树的后序遍历结果,包括算法实现与实例解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
     8
    / \
  6 10
  / \   / \
5 7 9 11
因此返回true。

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


思路:

(1) 二元查找树的性质:左子树< 根 < 右子树

(2)在后序遍历的过程中根总是最后一个访问的,所以最后一个元素是根,那么根据(1)

          我们有,以某个数为分界点,前面都小于根,后面都大于根,否则返回false;然后

          进行一个递归可得解,其中临界点是 只有一个点的时候恒成立。


#include <iostream>
#include <vector>

using namespace std;
typedef int T;
typedef vector<T> VRI;

bool IsSuit(VRI &vr,int low,int high)
{

	if ( low == high )
		return true;

	for (int i = low;vr[i] < vr[high] && i < high;i ++)
		;
	int middle = i;
	for (;i < high;i ++)
		if( vr[i] < vr[high] )
			return false;
	
	if ( !IsSuit(vr,low,middle-1) )
		return false;
	if ( !IsSuit(vr,middle,high-1) )
		return false;

	return true;
}

int main()
{
	VRI vr1;
	vr1.reserve(20);
	T key = 0;

	while ( !(cin >> key).eof() )
	{
		vr1.push_back(key);
	}

	if ( IsSuit(vr1,0,vr1.size()-1) )
		cout << "true" << endl;
	else
		cout << "false" <<endl;

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值