- 题目描述:
-
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 输入:
-
每个测试案例包括2行:
第一行为1个整数n(1<=n<=10000),表示数组的长度。
第二行包含n个整数,表示这个数组,数组中的数的范围是[0,100000000]。
- 输出:
-
对应每个测试案例,如果输入数组是某二叉搜索树的后序遍历的结果输出Yes,否则输出No。
- 样例输入:
-
75 7 6 9 11 10 847 4 6 5
- 样例输出:
-
YesNo
总结:递归思路划分左右子树判断清晰了很好写,注意右子树要除去根,(之前没注意于是程序陷在右子树不停递归溢出)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <vector>
using namespace std;
int traverseSeq[10000];
bool Judge(int *pStart,int len)
{
if(len<=1)
return true;
int rootVal = pStart[len-1];
int pos=0;
while (pStart[pos]<rootVal)//有哨兵
pos++;
int rightTreeStart = pos;
while(pos<len)
{
if(pStart[pos]<rootVal)
return false;
pos++;
}
bool lTag = Judge(pStart,rightTreeStart);
bool rTag = Judge(pStart+rightTreeStart,len-rightTreeStart-1);
return lTag&&rTag;
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
while (cin>>n)
{
for(int i=0; i<n; i++)
cin>>traverseSeq[i];
if(Judge(traverseSeq,n))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}