二叉树在C语言中的实现与应用详解.docx

上传人:b****1 文档编号:642209 上传时间:2022-10-11 格式:DOCX 页数:10 大小:16.75KB
下载 相关 举报
二叉树在C语言中的实现与应用详解.docx_第1页
第1页 / 共10页
二叉树在C语言中的实现与应用详解.docx_第2页
第2页 / 共10页
二叉树在C语言中的实现与应用详解.docx_第3页
第3页 / 共10页
二叉树在C语言中的实现与应用详解.docx_第4页
第4页 / 共10页
二叉树在C语言中的实现与应用详解.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

二叉树在C语言中的实现与应用详解.docx

《二叉树在C语言中的实现与应用详解.docx》由会员分享,可在线阅读,更多相关《二叉树在C语言中的实现与应用详解.docx(10页珍藏版)》请在冰豆网上搜索。

二叉树在C语言中的实现与应用详解.docx

二叉树在C语言中的实现与应用详解

/************************************************************************/

二叉树在C语言中的实现与应用

/************************************************************************/

#include

#include

#defineSTACK_MAX_SIZE30

#defineQUEUE_MAX_SIZE30

#ifndefelemType

typedefcharelemType;

#endif

/************************************************************************/

/*以下是关于二叉树操作的11个简单算法*/

/************************************************************************/

structBTreeNode{

elemTypedata;

structBTreeNode*left;

structBTreeNode*right;

};

/*1.初始化二叉树*/

voidinitBTree(structBTreeNode**bt)

{

*bt=NULL;

return;

}

/*2.建立二叉树(根据a所指向的二叉树广义表字符串建立)*/

voidcreateBTree(structBTreeNode**bt,char*a)

{

structBTreeNode*p;

structBTreeNode*s[STACK_MAX_SIZE];/*定义s数组为存储根结点指针的栈使用*/

inttop=-1;/*定义top作为s栈的栈顶指针,初值为-1,表示空栈*/

intk;/*用k作为处理结点的左子树和右子树,k=1处理左子树,k=2处理右子树*/

inti=0;/*用i扫描数组a中存储的二叉树广义表字符串,初值为0*/

*bt=NULL;/*把树根指针置为空,即从空树开始建立二叉树*/

/*每循环一次处理一个字符,直到扫描到字符串结束符\0为止*/

while(a[i]!

='\0'){

switch(a[i]){

case'':

break;/*对空格不作任何处理*/

case'(':

if(top==STACK_MAX_SIZE-1){

printf("栈空间太小!

\n");

exit

(1);

}

top++;

s[top]=p;

k=1;

break;

case')':

if(top==-1){

printf("二叉树广义表字符串错误!

\n");

exit

(1);

}

top--;

break;

case',':

k=2;

break;

default:

p=newBTreeNode;

p->data=a[i];

p->left=p->right=NULL;

if(*bt==NULL){

*bt=p;

}else{

if(k==1){

s[top]->left=p;

}else{

s[top]->right=p;

}

}

}

i++;/*为扫描下一个字符修改i值*/

}

return;

}

/*3.检查二叉树是否为空,为空则返回1,否则返回0*/

intemptyBTree(structBTreeNode*bt)

{

if(bt==NULL){

return1;

}else{

return0;

}

}

/*4.求二叉树深度*/

intBTreeDepth(structBTreeNode*bt)

{

if(bt==NULL){

return0;/*对于空树,返回0结束递归*/

}else{

intdep1=BTreeDepth(bt->left);/*计算左子树的深度*/

intdep2=BTreeDepth(bt->right);/*计算右子树的深度*/

if(dep1>dep2){

returndep1+1;

}else{

returndep2+1;

}

}

}

/*5.从二叉树中查找值为x的结点,若存在则返回元素存储位置,否则返回空值*/

elemType*findBTree(structBTreeNode*bt,elemTypex)

{

if(bt==NULL){

returnNULL;

}else{

if(bt->data==x){

return&(bt->data);

}else{/*分别向左右子树递归查找*/

elemType*p;

if(p=findBTree(bt->left,x)){

returnp;

}

if(p=findBTree(bt->right,x)){

returnp;

}

returnNULL;

}

}

}

/*6.输出二叉树(前序遍历)*/

voidprintBTree(structBTreeNode*bt)

{

/*树为空时结束递归,否则执行如下操作*/

if(bt!

=NULL){

printf("%c",bt->data);/*输出根结点的值*/

if(bt->left!

=NULL||bt->right!

=NULL){

printf("(");

printBTree(bt->left);

if(bt->right!

=NULL){

printf(",");

}

printBTree(bt->right);

printf(")");

}

}

return;

}

/*7.清除二叉树,使之变为一棵空树*/

voidclearBTree(structBTreeNode**bt)

{

if(*bt!

=NULL){

clearBTree(&((*bt)->left));

clearBTree(&((*bt)->right));

free(*bt);

*bt=NULL;

}

return;

}

/*8.前序遍历*/

voidpreOrder(structBTreeNode*bt)

{

if(bt!

=NULL){

printf("%c",bt->data);/*访问根结点*/

preOrder(bt->left);/*前序遍历左子树*/

preOrder(bt->right);/*前序遍历右子树*/

}

return;

}

/*9.前序遍历*/

voidinOrder(structBTreeNode*bt)

{

if(bt!

=NULL){

inOrder(bt->left);/*中序遍历左子树*/

printf("%c",bt->data);/*访问根结点*/

inOrder(bt->right);/*中序遍历右子树*/

}

return;

}

/*10.后序遍历*/

voidpostOrder(structBTreeNode*bt)

{

if(bt!

=NULL){

postOrder(bt->left);/*后序遍历左子树*/

postOrder(bt->right);/*后序遍历右子树*/

printf("%c",bt->data);/*访问根结点*/

}

return;

}

/*11.按层遍历*/

voidlevelOrder(structBTreeNode*bt)

{

structBTreeNode*p;

structBTreeNode*q[QUEUE_MAX_SIZE];

intfront=0,rear=0;

/*将树根指针进队*/

if(bt!

=NULL){

rear=(rear+1)%QUEUE_MAX_SIZE;

q[rear]=bt;

}

while(front!

=rear){/*队列非空*/

front=(front+1)%QUEUE_MAX_SIZE;/*使队首指针指向队首元素*/

p=q[front];

printf("%c",p->data);

/*若结点存在左孩子,则左孩子结点指针进队*/

if(p->left!

=NULL){

rear=(rear+1)%QUEUE_MAX_SIZE;#include

#include

#defineSTACK_MAX_SIZE30

#defineQUEUE_MAX_SIZE30

#ifndefelemType

typedefcharelemType;

#endif

/************************************************************************/

/*以下是关于二叉树操作的11个简单算法*/

/************************************************************************/

structBTreeNode{

elemTypedata;

structBTreeNode*left;

structBTreeNode*right;

};

/*1.初始化二叉树*/

voidinitBTree(structBTreeNode**bt)

{

*bt=NULL;

return;

}

/*2.建立二叉树(根据a所指向的二叉树广义表字符串建立)*/

voidcreateBTree(structBTreeNode**bt,char*a)

{

structBTreeNode*p;

structBTreeNode*s[STACK_MAX_SIZE];/*定义s数组为存储根结点指针的栈使用*/

inttop=-1;/*定义top作为s栈的栈顶指针,初值为-1,表示空栈*/

intk;/*用k作为处理结点的左子树和右子树,k=1处理左子树,k=2处理右子树*/

inti=0;/*用i扫描数组a中存储的二叉树广义表字符串,初值为0*/

*bt=NULL;/*把树根指针置为空,即从空树开始建立二叉树*/

/*每循环一次处理一个字符,直到扫描到字符串结束符\0为止*/

while(a[i]!

='\0')

{

switch(a[i])

{

case'':

break;/*对空格不作任何处理*/

case'(':

if(top==STACK_MAX_SIZE-1)

{

printf("栈空间太小!

\n");

exit

(1);

}

top++;

s[top]=p;

k=1;

break;

case')':

if(top==-1){

p

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 从业资格考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1