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

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

如果是返回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;
}
点赞