代码实现功能:
创建二叉树、先序(中序、后续、层次)遍历、叶子节点数、节点数、高度(深度) 。
#include<stdio.h>
#include<stdlib.h>
typedef struct BT
{
char data;
struct BT * lchild, *rchild;
}BT;
BT * Create_tree() //先序创建树
{
BT * T;
char x;
scanf_s("%c", &x);
getchar();
if(x=='0')
T=NULL;
else
{
T=(BT *)malloc(sizeof(BT));
T->data=x;
printf("请输入 %c 的左孩子:", T->data);
T->lchild=Create_tree();
printf("请输入 %c 的右孩子:", T->data);
T->rchild=Create_tree();
}
return T;
}
void pre_tree(BT * T) //先序遍历
{
if(T==NULL)
return;
else
{
printf("%c", T->data);
pre_tree(T->lchild);
pre_tree(T->rchild);
}
}
void in_tree(BT * T) //中序遍历
{
if(T==NULL)
return;
else
{
in_tree(T->lchild);
printf("%c", T->data);
in_tree(T->rchild);
}
}
void post_tree(BT * T) //后序遍历
{
if(T==NULL)
return ;
else
{
post_tree(T->lchild);
post_tree(T->rchild);
printf("%c", T->data);
}
}
void level_tree(BT * T) //层次遍历
{
int i, j;
BT * q[50], *p;
p=T;
if(T!=NULL)
{
i=1;
q[1]=p;
j=2;
}
while(i!=j)
{
p=q[i];
printf("%c", p->data);
if(p->lchild!=NULL)
{
q[j]=p->lchild;
j++;
}
if(p->rchild!=NULL)
{
q[j]=p->rchild;
j++;
}
i++;
}
}
void leaf_num(BT * T, int * num) //叶子节点数
{
if(T!=NULL)
{
if(T->lchild==NULL && T->rchild==NULL)
(*num)++;
leaf_num(T->lchild, num);
leaf_num(T->rchild, num);
}
}
void node_num(BT * T, int * count) //节点数
{
if(T==NULL)
return;
else
{
(*count)++;
node_num(T->lchild, count);
node_num(T->rchild, count);
}
}
int depth_tree(BT * T) //树的高度(深度)
{
int ld, rd;
if(T==NULL)
return 0;
else
{
ld=depth_tree(T->lchild);
rd=depth_tree(T->rchild);
}
return (ld > rd ? ld: rd)+1;
}
int main()
{
BT * T;
int num, count;
num=count=0;
printf("创建树:");
T=Create_tree();
printf("先序遍历:");
pre_tree(T);
printf("\n");
printf("中序遍历:");
in_tree(T);
printf("\n");
printf("后序遍历:");
post_tree(T);
printf("\n");
printf("层次遍历:");
level_tree(T);
printf("\n");
leaf_num(T, &num);
printf("叶子节点数:%d\n", num);
node_num(T , &count);
printf("节点数:%d\n", count);
printf("二叉树的深度:%d\n", depth_tree(T));
}