#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;
#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;
}
结果: