【问题描述】给定的二叉树是否为二叉排序树
【样例输入1】先序序列:10 5 4 -1 -1 -1 30 -1 -1
【样例输出1】是
【样例输入2】先序序列:10 5 6 -1 -1 -1 30 -1 -1
【样例输出2】不是
【样例输入3】先序序列:10 -1 -1
【样例输出3】是
【样例输入4】先序序列:-1
【样例输出4】是
//要求:写一个给定的二叉树是否为二叉排序树的算法。树中结点各不相同
//思想:利用二叉排序树的中序遍历序列是升序的特点
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stddef.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define STACK_INIT_SIZE 100
typedef int Status;
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode, *BiTree;
//输入先序序列,创建二叉树
void CreateBiTree(BiTree &T)
{ int ch;
scanf("%d",&ch);
if (ch == -1) T = NULL;
else
{ T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void IsBST(BiTree T,BiTree &pre,int &isBST)
{ struct SeqStack
{ BiTree data[STACK_INIT_SIZE];
int top;
}s; //定义栈存储指针信息
int i=0,j=0;
int a[STACK_INIT_SIZE]={}; //辅助数组存储中序遍历结果
BiTree p;
s.top=-1;p=T;
//若p=NULL且栈空,则算法结束
while(p||s.top!=-1){
while(p){
if(s.top==STACK_INIT_SIZE-1) printf("OVERFLOW");
else s.data[++s.top]=p;
p=p->lchild; //左子树遍历完成
}
if(s.top!=-1){
p=s.data[s.top--];
a[i++]=p->data;
p=p->rchild;
}
}
//验证中序遍历结果是否递增
for(j=0;j<i-1;j++)
{
if(a[j]>a[j+1]) isBST=FALSE;
}
}
int main()
{ BiTree T,pre=NULL;
int isBST = TRUE;
// printf("请输入先序序列创建二叉树:");
CreateBiTree(T);
IsBST(T,pre,isBST);
if(isBST)
printf("是");
else
printf("不是");
printf("\n");
return 1;
}