实现二叉排序树的各种算法(1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "stdio.h"
#include "malloc.h"
#include "math.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
//#define OVERFLOW -2
#define MAXQSIZE 100 // 最大队列长度(对于循环队列,最大队列长度要减1)
#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACKINCREMENT 10 // 存储空间分配增量
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;
typedef BiTree SElemType;
typedef BiTree QElemType;
typedef struct
{
QElemType *base; // 初始化的动态分配存储空间
int front; // 头指针,若队列不空,指向队列头元素
int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置
}SqQueue;
typedef struct
{
SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
SElemType *top; // 栈顶指针
int stacksize; // 当前已分配的存储空间,以元素为单位
}SqStack; // 顺序栈
Status InitStack(SqStack &S)
{
// 构造一个空栈S,该栈预定义大小为STACK_INIT_SIZE
// 请补全代码
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;
}
Status Push(SqStack &S,BiTree e)
{
// 在栈S中插入元素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)
{
// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
// 请补全代码
if(S.top == S.base)
return ERROR;
e = * --S.top;
return OK;
}
Status InitQueue(SqQueue &Q)
{
// 构造一个空队列Q,该队列预定义大小为MAXQSIZE
// 请补全代码
Q.base = (QElemType *)malloc (MAXQSIZE * sizeof(QElemType));
if(!Q.base) return ERROR;
Q.front = Q.rear = 0;
return OK;
}
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 CreateBiTree(BiTree &T , int n) { // 算法6.4
// 按先序次序输入二叉树中结点的值(一个字符),’#’
字符表示空树,
// 构造二叉链表表示的二叉树T。
int i ,e ,loop = 1;
BiTree S1,S2;
for(i=1;i<=n;i++)
{
loop = 1;
scanf("%d",&e);
if(!(S1 = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;
S1 -> data = e;S1 -> lchild = NULL;S1 -> rchild = NULL;
S2 = T;
if(S2 == NULL) T = S1;
else while(loop)
{
if(S1->data < S2->data)
if(S2->lchild == NULL)
{S2 ->lchild = S1; loop = 0;}
else S2=S2->lchild;
else if(S2->rchild == NULL)
{S2 -> rchild = S1; loop = 0;}
else S2=S2->rchild;
}
}
return OK;
} // CreateBiTree
Status Insert( BiTree T)
{
BiTree S1, S2;
ElemType e;
scanf("%d",&e);
if(!(S2 = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;
S2 -> data = e;S2 -> rchild = NULL; S2 -> lchild = NULL;
S1 = T;
while(T)
{
if(S1 -> data <= S2-> data)
if(!S1 -> rchild)
{S1 -> rchild = S2;return OK;}
else S1 = S1->rchild;
else
if(!S1 -> lchild)
{S1 -> lchild = S2;return OK;}
else S1 = S1->lchild;
}
T = S2;
return OK;
}
Status Search( BiTree T ,ElemType e)
{
BiTree S;
S = T;
while(S)
{
if(S -> data < e)
S = S->rchild;
else if(S -> data > e)
S = S->lchild;
else return OK;
}
return ERROR;
}
Status Visit( ElemType e ) { // 输出元素e的值
printf("%d ", e );
return OK;
}// PrintElement
Status PreOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) {
// 前序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
//补全代码,可用多个语句
if(T)
{
if(Visit(T->data))
if(PreOrderTraverse(T->lchild , Visit))
if(PreOrderTraverse(T->rchild , Visit)) return OK;
return ERROR;
}else return OK;
} // PreOrderTraverse
Status InOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) {
// 中序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
//补全代码,可用多个语句if(T)
if(T)
{
if(InOrderTraverse(T->lchild , Visit))
if(Visit(T->data))
if(InOrderTraverse(T->rchild , Visit)) return OK;
return ERROR;
}else return OK;
} // InOrderTraverse
Status PostOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) {
// 后序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
//补全代码,可用多个语句
if(T)
{if(PostOrderTraverse(T->lchild , Visit))
if(PostOrderTraverse(T->rchild , Visit))
if(Visit(T->data)) return OK;
return ERROR;
}else return OK;
} // PostOrderTraverse
Status Dif_InOrder( 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 Level( BiTree T )
{
BiTree S1, S3, S4;
S1 = T;
SqQueue S2;
InitQueue(S2);
EnQueue(S2,S1);
while(S2.front != S2.rear)
{
D
eQueue(S2,S1);
printf("%d ",S1->data);
S3 = S1->lchild;S4 = S1->rchild;
if(S3) EnQueue(S2,S3);
if(S4) EnQueue(S2,S4);
}
return OK;
}
int main() //主函数
{
BiTree T=NULL;
int n;
ElemType e;
scanf("%d", &n);
if(!CreateBiTree(T,n))
return ERROR;
PreOrderTraverse( T, Visit );
printf("\n");
InOrderTraverse( T, Visit);
printf("\n");
PostOrderTraverse( T, Visit );
printf("\n");
scanf("%d",&e);
printf("%d\n",Search(T,e));
scanf("%d",&e);
printf("%d\n",Search(T,e));
Insert(T);
PreOrderTraverse( T, Visit );
printf("\n");
InOrderTraverse( T, Visit);
printf("\n");
PostOrderTraverse( T, Visit );
printf("\n");
Dif_InOrder( T );
printf("\n");
Level( T );
return OK;//补充代码
}//main