简单的C语言二叉树的实现代码

#include <stdio.h>
#include <MALLOC.H>
#include <ASSERT.H>
#include <STDLIB.H>


typedef int ElemType;
typedef struct Node
{
ElemType e;
struct Node *left,*rigth;
}BT;


//构造二叉树,按二叉排序树方式构造
void insertNode(BT *bt,ElemType e)
{
assert(bt != NULL);
Node *p,*temp;
int left;
while(bt != NULL)
{
temp = bt;
if (e == bt->e)
return ;
if (e < bt->e)
{
bt = bt->left;
left = 1;
continue;
}
if (e > bt->e)
{
bt = bt->rigth;
left = 0;
continue;
}
}
p = (Node *)malloc(sizeof(Node));
if (!p) exit(0);
p->e = e;
p->left = p->rigth = NULL;
if (left)
temp->left = p;
else
temp->rigth = p;
}
//前序遍历
void preorder(BT *bt,void (*visit)(ElemType e))
{
if (bt != NULL)
{
visit(bt->e);
preorder(bt->left,visit);
preorder(bt->rigth,visit);
}
}
//中序遍历
void inorder(BT *bt,void (*visit)(ElemType e))
{
if (bt != NULL)
{
inorder(bt->left,visit);
visit(bt->e);
inorder(bt->rigth,visit);
}
}
//后序遍历
void postorder(BT *bt,void (*visit)(ElemType e))
{
if (bt != NULL)
{
postorder(bt->left,visit);
postorder(bt->rigth,visit);
visit(bt->e);
}
}
//树的深度
int depth(BT *bt)
{
int l,r;
if (!bt) return 0;
l=depth(bt->left)+1;
r=depth(bt->rigth)+1;
return (l>r)?l:r;
}
//结点个数
int nodeNum(BT *bt)
{
int l,r;
if (!bt) return 0;
l=nodeNum(bt->left);
r=nodeNum(bt->rigth);
return l+r+1;
}
//销毁二叉树
void destoryBt(BT *bt)
{
if (!bt)
{
destoryBt(bt->left);
destoryBt(bt->rigth);
free(bt);
}
}


void myPrint(ElemType e)
{
printf("%d ",e);
}


int main(void)
{
BT bt;
ElemType arr[]={15,3,9,11,22,32,65,1,20,10};
int arrLength = sizeof(arr)/sizeof(arr[0]);
int i=1;
void (*p)(ElemType e) = &myPrint;


bt.e=arr[0];
bt.left=bt.rigth=NULL;
while(i<arrLength)
{
insertNode(&bt,arr[i++]);
}
printf("\n------------二叉树----------\n\n");
printf("前序遍历:");
preorder(&bt,p);
printf("\n中序遍历:");
inorder(&bt,p);
printf("\n后序遍历:");
postorder(&bt,p);
printf("\n");
printf("树的深度:%d\n",depth(&bt));
printf("结点个数:%d\n",nodeNum(&bt));
destoryBt(&bt);
printf("销毁二叉树...\n\n");


return 0;

}


结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值