数据结构C语言实现系列7二叉树.docx
- 文档编号:6912083
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:13
- 大小:18.10KB
数据结构C语言实现系列7二叉树.docx
《数据结构C语言实现系列7二叉树.docx》由会员分享,可在线阅读,更多相关《数据结构C语言实现系列7二叉树.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构C语言实现系列7二叉树
数据结构C语言实现系列[7]——二叉树[1]
#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=malloc(sizeof(structBTreeNode));
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;
q[rear]=p->left;
}
/*若结点存在右孩子,则右孩子结点指针进队*/
if(p->right!
=NULL){
rear=(rear+1)%QUEUE_MAX_SIZE;
q[rear]=p->right;
}
}
return;
}
/************************************************************************/
/*
intmain(intargc,char*argv[])
{
structBTreeNode*bt;/*指向二叉树根结点的指针*/
char*b; /*用于存入二叉树广义表的字符串*/
elemTypex,*px;
initBTree(&bt);
printf("输入二叉树广义表的字符串:
\n");
/*scanf("%s",b);*/
b="a(b(c),d(e(f,g),h(,i)))";
createBTree(&bt,b);
if(bt!
=NULL)
printf("%c",bt->data);
printf("以广义表的形式输出:
\n");
printBTree(bt); /*以广义表的形式输出二叉树*/
printf("\n");
printf("前序:
"); /*前序遍历*/
preOrder(bt);
printf("\n");
printf("中序:
"); /*中序遍历*/
inOrder(bt);
printf("\n");
printf("后序:
"); /*后序遍历*/
postOrder(bt);
printf("\n");
printf("按层:
"); /*按层遍历*/
levelOrder(bt);
printf("\n");
/*从二叉树中查找一个元素结点*/
printf("输入一个待查找的字符:
\n");
scanf("%c",&x); /*格式串中的空格跳过空白字符*/
px=findBTree(bt,x);
if(px){
printf("查找成功:
%c\n",*px);
}else{
printf("查找失败!
\n");
}
printf("二叉树的深度为:
");
printf("%d\n",BTreeDepth(bt));
clearBTree(&bt);
return0;
}
*/
数据结构C语言实现系列[7]——二叉树[2]
#include
#defineQUEUE_MAX_SIZE20
#defineSTACK_MAX_SIZE10
typedefintelemType;
#include"BT.c"
/************************************************************************/
/* 以下是关于二叉搜索树操作的4个简单算法 */
/************************************************************************/
/*1.查找*/
/*递归算法*/
elemType*findBSTree1(structBTreeNode*bst,elemTypex)
{
/*树为空则返回NULL*/
if(bst==NULL){
returnNULL;
}else{
if(x==bst->data){
return&(bst->data);
}else{
if(x
returnfindBSTree1(bst->left,x);
}else{ /*向右子树查找并直接返回*/
returnfindBSTree1(bst->right,x);
}
}
}
}
/*非递归算法*/
elemType*findBSTree2(structBTreeNode*bst,elemTypex)
{
while(bst!
=NULL){
if(x==bst->data){
return&(bst->data);
}elseif(x
bst=bst->left;
}else{
bst=bst->right;
}
}
returnNULL;
}
/*2.插入*/
/*递归算法*/
voidinsertBSTree1(structBTreeNode**bst,elemTypex)
{
/*新建一个根结点*/
if(*bst==NULL){
structBTreeNode*p=(structBTreeNode*)malloc(sizeof(structBTreeNode));
p->data=x;
p->left=p->right=NULL;
*bst=p;
return;
}elseif(x<(*bst)->data){ /*向左子树完成插入运算*/
insertBSTree1(&((*bst)->left),x);
}else{ /*向右子树完成插入运算*/
insertBSTree1(&((*bst)->right),x);
}
}
/*非递归算法*/
voidinsertBSTree2(structBTreeNode**bst,elemTypex)
{
structBTreeNode*p;
structBTreeNode*t=*bst,*parent=NULL;
/*为待插入的元素查找插入位置*/
while(t!
=NULL){
parent=t;
if(x
t=t->left;
}else{
t=t->right;
}
}
/*建立值为x,左右指针域为空的新结点*/
p=(structBTreeNode*)malloc(sizeof(structBTreeNode));
p->data=x;
p->left=p->right=NULL;
/*将新结点链接到指针为空的位置*/
if(parent==NULL){
*bst=p; /*作为根结点插入*/
}elseif(x
parent->left=p;
}else{
parent->right=p;
}
return;
}
/*3.建立*/
voidcreateBSTree(structBTreeNode**bst,elemTypea[],intn)
{
inti;
*bst=NULL;
for(i=0;i insertBSTree1(bst,a[i]); } return; } /*4.删除值为x的结点,成功返回1,失败返回0*/ intdeleteBSTree(structBTreeNode**bst,elemTypex) { structBTreeNode*temp=*bst; if(*bst==NULL){ return0; } if(x<(*bst)->data){ returndeleteBSTree(&((*bst)->left),x); /*向左子树递归*/ } if(x>(*bst)->data){ returndeleteBSTree(&((*bst)->right),x); /*向右子树递归*/ } /*待删除的元素等于树根结点值且左子树为空,将右子树作为整个树并返回1*/ if((*bst)->left==NULL){ *bst=(*bst)->right; free(temp); return1; } /*待删除的元素等于树根结点值且右子树为空,将左子树作为整个树并返回1*/ if((*bst)->right==NULL){ *bst=(*bst)->left; free(temp); return1; }else{ /*中序前驱结点为空时,把左孩子结点值赋给树根结点,然后从左子树中删除根结点*/ if((*bst)->left->right==NULL){ (*bst)->data=(*bst)->left->data; returndeleteBSTree(&((*bst)->left),(*bst)->data); }else{ /*定位到中序前驱结点,把该结点值赋给树根结点,然后从以中序前驱结点为根的 树上删除根结点*/ structBTreeNode*p1=*bst,*p2=p1->left; while(p2->right! =NULL){ p1=p2; p2=p2->right; } (*bst)->data=p2->data; returndeleteBSTree(&(p1->right),p2->data); } } } /************************************************************************/ intmain(intargc,char*argv[]) { intx,*px; elemTypea[10]={30,50,20,40,25,70,54,23,80,92}; structBTreeNode*bst=NULL; createBSTree(&bst,a,10); printf("建立的二叉搜索树的广义表形式为: "); printBTree(bst); printf(""); printf("中序遍历: "); inOrder(bst); printf(""); printf("输入待查找元素的值: "); scanf("%d",&x); if(px=findBSTree1(bst,x)){ printf("查找成功! 得到的x为: %d",*px); }else{ printf("查找失败! "); } printf("输入待插入的元素值: "); scanf("%d",
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言 实现 系列 二叉
![提示](https://static.bdocx.com/images/bang_tan.gif)