【样例输入】输入5 7 6 9 11 10 8
【样例输出】true
#include<iostream>
#define MAX 50
using namespace std;
//与用前序和中序创建二叉树的思路差不多
bool Judge(int a[],int pre,int root) {
if (pre >= root) {
return true;
}
int mid=pre;
//判断是否第一个比根节点大的数后面的都比根节点大
while (a[mid] < a[root]) {
mid++;
}
int mid1 = mid;
while (mid1 < root) {
if (a[mid1++] < a[root])
return false;
}
bool count=Judge(a, mid, root-1);
bool count1=Judge(a, pre, mid - 1);
if (count1 == false || count == false) {
return false;
}
return true;
}
int main() {
int a[MAX];
int i = 1;
//这里因为没有给定可见停止输出的标志符,所以拿回车作为停止标志符,getchar()可接收空格和回车
do {
cin >> a[i++];
} while (getchar() != '\n');
a[0] = i-1;
if (Judge(a, 1, i - 1)) {
cout << "true";
}
else {
cout << "false";
}
return 0;
}
本题要根据后续遍历的特点,先输出左子树,后输出右子树,最后输出根节点,而二叉排列树的左子树比根节点小,右子树比根节点大。因此一个序列若代表一个有左右子树的排列二叉树,该序列应呈现从左到右比根节点小,接着比根节点大的样子。
根据这一思路,我们可以用递归来判断整个树的子树是否为二叉排列树。