题目:这是二叉搜索树吗?
思路:
(1)利用指针建树;
(2)递归先序(或镜像)判断是否相等;
(3)递归后序(或镜像)输出;
代码:
#include <cstdio>
#include <cstdlib>
const int maxn = 1005;
typedef struct TreeNode *Tree;
struct TreeNode{
Tree Left,Right;
int data;
};
int a[maxn];
Tree insert(int v,Tree T){//插入结点
if(!T){//空树开辟空间
T = (Tree)malloc(sizeof(struct TreeNode));
T->data = v;
T->Left = T->Right = NULL;
}else{
if(v < T->data) T->Left = insert(v,T->Left);//小于往左
else T->Right = insert(v,T->Right);//大于等于往右
}
return T;
}
Tree BuildTree(int n){//建树
Tree T = NULL;
for(int i=0;i<n;i++){
T = insert(a[i],T);
}
return T;
}
int index,flag;
void PreorderL(Tree T){//先序检测
if(a[index++] != T->data){
flag = 0;return;
}
if(T->Left)PreorderL(T->Left);
if(T->Right)PreorderL(T->Right);
}
void PreorderR(Tree T){//先序镜像检测
if(a[index++] != T->data){
flag = 0;return;
}
if(T->Right) PreorderR(T->Right);
if(T->Left) PreorderR(T->Left);
}
void printL(Tree T,int n){//后序输出
if(T->Left) printL(T->Left,n);
if(T->Right) printL(T->Right,n);
printf("%d",T->data);
if(++index < n) printf(" ");
}
void printR(Tree T,int n){//镜像后序输出
if(T->Right) printR(T->Right,n);
if(T->Left) printR(T->Left,n);
printf("%d",T->data);
if(++index < n) printf(" ");
}
int main(){
int n;
Tree T;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++) scanf("%d",&a[i]);
T = BuildTree(n);
flag = 1;index = 0;PreorderL(T);
if(flag){
printf("YES\n");
index = 0;printL(T,n);printf("\n");continue;
}
flag = 1;index = 0;PreorderR(T);
if(flag) {
printf("YES\n");
index = 0;printR(T,n);printf("\n");continue;
}
printf("NO\n");
free(T);
}
return 0;
}