8607 实现二叉排序树的各种算法(1)

#include "stdio.h"
#include "malloc.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100//栈
#define STACKINCREMENT 10//栈
#define MAXQSIZE 100//队列
typedef int Status;
typedef int ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;
typedef BiTree QElemType;//队列
typedef BiTree SElemType;//栈
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;//栈接构
Status InitStack(SqStack &S)
{
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base) return ERROR;
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//构建空栈S
Status StackEmpty(SqStack S)
{
if(S.top=S.base) return OK;
else return ERROR;
}//判断栈是否为空
Status GetTop(SqStack S,SElemType &e)
{
if(S.top==S.base) return ERROR;
e=*(S.top-1);
return OK;
}//获取栈的顶元素
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize){
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base) return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//插入
Status Pop(SqStack &S,SElemType &e)
{
if(S.base==S.top) return ERROR;
e=*--S.top;
return OK;
}//删除
typedef struct{
QElemType *base;
int front;
int rear;
}SqQueue;//队列
Status InitQueue(SqQueue &Q)
{
Q.base = (QElemType *)malloc (MAXQSIZE * sizeof(QElemType));
if(!Q.base) return ERROR;
Q.front=Q.rear=0;
return OK;
}//构造一个空队列Q
Status EnQueue(SqQueue &Q,QElemType e)
{
// 插入元素e为Q的新的队尾元素
// 请补全代码
if((Q.rear + 1)% MAXQSIZE == Q.front)return ERROR;
Q.base[Q.rear] = e ;
Q.rear = (Q.rear + 1) % MAXQSIZE;
return OK;
}

Status DeQueue(SqQueue &Q, QElemType &e)
{
// 若队列不空, 则删除Q的队头元素, 用e返回其值, 并返回OK; 否则返回ERROR
// 请补全代码
if(Q.front == Q.rear) return ERROR;
e = Q.base[Q.front];
Q.front = (Q.front +1) % MAXQSIZE;
return OK;
}

Status Insert( BiTree &T)
{
BiTree A, B;
ElemType e;
scanf("%d",&e);
if(!T){
if(!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;
T->data=e;
T->rchild=NULL;
T->lchild=NULL;
return OK;
}//if
else{
if(!(A = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;
A->data = e;
A->rchild=NULL;
A->lchild=NULL;
B=T;
while(1)
{
if(B->data<=A->data)
if(!B->rchild)
{
B->rchild=A;
return OK;
}
else B=B->rchild;
else
if(!B->lchild)
{B-> lchild=A;return OK;}
else B=B->lchild;
}//while
T =B;
return OK;}//else
}



Status PrintElement( ElemType e ) { //

输出元素e的值
printf("%d ", e );
return OK;
}// PrintElement


Status PreOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) {
if(T){
printf("%d ",T->data);
PreOrderTraverse(T->lchild,Visit);
PreOrderTraverse(T->rchild,Visit);
}
// 前序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
//补全代码,可用多个语句

} // PreOrderTraverse

Status InOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) {
if(T){
InOrderTraverse(T->lchild,Visit);
printf("%d ",T->data);
InOrderTraverse(T->rchild,Visit);
}// 中序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
//补全代码,可用多个语句


} // InOrderTraverse

Status PostOrderTraverse( BiTree T, Status(*Visit)(ElemType) ){
if(T){
PostOrderTraverse(T->lchild,Visit);
PostOrderTraverse(T->rchild,Visit);
printf("%d ",T->data);
}// 后序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
//补全代码,可用多个语句

} // PostOrderTraverse
Status MidTraverse( BiTree T )
{
BiTree S1;
SqStack S2;
S1 = T;
InitStack(S2);
while(S1 || S2.base != S2.top)
{
if(S1)
{Push( S2, S1);S1 = S1-> lchild;}
else
{
Pop(S2,S1);
printf("%d ",S1->data);
S1=S1->rchild;
}
}
return OK;
}//非递归中序遍历
Status FTraverse(BiTree T)
{
BiTree A,L,R;
SqQueue S;
InitQueue(S);
A=T;
EnQueue(S,T);
while(S.front!=S.rear)
{
DeQueue(S,A);
printf("%d ",A->data);
L=A->lchild;
R=A->rchild;
if(L) EnQueue(S,L);
if(R) EnQueue(S,R);
}
return OK;
}
Status search(BiTree T,ElemType e)
{
BiTree A;
A=T;
while(A)
{
if(A->dataA=A->rchild;
else if(A->data>e)
A=A->lchild;
else return OK;
}
return ERROR;
}
int main() //主函数
{
BiTree T=NULL;
int n,i,e;
scanf("%d",&n);
for(i=0;iInsert(T);
PreOrderTraverse(T,PrintElement);
putchar('\n');
InOrderTraverse(T,PrintElement);
putchar('\n');
PostOrderTraverse(T,PrintElement);
putchar('\n');
scanf("%d",&e);
printf("%d\n",search(T,e));
scanf("%d",&e);
printf("%d\n",search(T,e));
Insert(T);
PreOrderTraverse(T,PrintElement);
putchar('\n');
InOrderTraverse(T,PrintElement);
putchar('\n');
PostOrderTraverse(T,PrintElement);
putchar('\n');
MidTraverse(T);
putchar('\n');
FTraverse(T);//补充代码
}//main




相关文档
最新文档