题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回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;
}