您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页实现二叉排序树的各种算法

实现二叉排序树的各种算法

来源:华佗小知识


wyf

实现二叉排序树的各种算法

一. 需求分析

(1)系统概述:

本系统是针对排序二叉树设计的各种算法,提供的功能包括有:(1) 插入新结点(2) 前序、中序、后序遍历二叉树(3) 中序遍历的非递归算法(4) 层次遍历二叉树(5) 在二叉树中查找给定关键字(函数返回值为成功1,失败0)

二. 总体设计

(1)系统模块结构图

(2)数据结构设计

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\

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\

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 \

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=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)

{

DeQueue(S2,S1);

printf(\"%d \

S3 = S1->lchild;S4 = S1->rchild;

if(S3) EnQueue(S2,S3);

if(S4) EnQueue(S2,S4);

}

return OK;

}

三. 总结

终于完成了这个实验报告,经过这次的磨练,我对数据结构这门学科有了更深的理解和感悟。对二叉树的各种操作也更熟悉了。经过这个小实验,我在算法方面还有更大的提升空间。我希望今后能更加注重算法的设计,我相信我的数据结构这门学科会学得很好的。这个实验过后我懂得了更多的编程技巧,学会了如何调试程序。这是实验过后总结的好处。希望以后能学到更多新知识。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务