前序遍历创建树:
bitree *creatbitree()//前序遍历的数值来创建树——递归
{
char ch;
bitree *root;
ch=getchar();//用于接收输入的数值
if(ch=='*') return NULL;//用*来判断是否为空
else{
root=(bitree *)malloc(sizeof(bitree));
root->data=ch;//赋值
root->lchild=creatbitree();//左子树
root->rchild=creatbitree();//右子树
}
return root;
}
[点击并拖拽以移动]
测量树的深度:
int depthbitree(bitree *T)//测量树的深度
{
if(T==NULL) return 0;
else{
int leftheighter=depthbitree(T->lchild);
int rightheighter=depthbitree(T->rchild);
return (leftheighter > rightheighter?leftheighter+1:rightheighter+1);
}
}
计算树的叶子和总结点数 :
int leaf_count(bitree *T)//测量叶子的数量
{
if(T==NULL) return 0;
else if(!T->lchild&&!T->rchild)//如果左右结点都为空则他就是叶子结点
return 1;
else return leaf_count(T->lchild)+leaf_count(T->rchild);
}
int countbitree(bitree *T)//测量总的结点个数
{
if(T==NULL)
return 0;
else{
return 1+countbitree(T->lchild)+countbitree(T->rchild);
}
}
前序、中序、后续遍历输出:
int preorder(bitree *T)//前序遍历序列 (根左右)
{
if(T==NULL)
return 0;
else{
printf("%c ",T->data);//先输出根节点
preorder(T->lchild);
preorder(T->rchild);
}
}
int inorder(bitree *T)//中序遍历序列 (左根右)
{
if(T==NULL)
return 0;
else{
inorder(T->lchild);//先输出左孩子
printf("%c ",T->data);
inorder(T->rchild);
}
}
int postorder(bitree *T)//后序遍历序列 (左右根)
{
if(T==NULL)
return 0;
else{
postorder(T->lchild);//先输出左孩子
postorder(T->rchild);
printf("%c ",T->data);
}
}
广义表形式输出:
void displaybitree(bitree *T)//广义表输出
{
if (T == NULL) return;
printf("%c", T->data);
if (T->lchild == NULL && T->rchild == NULL)//判断是否是叶子节点
return;
printf("(");
displaybitree(T->lchild);
printf(",");
displaybitree(T->rchild);
printf(")");
return;
}
删除树
bitree *Delete(bitree *T)//删除树
{
if(T->lchild)
Delete(T->lchild);
else if(T->rchild)
Delete(T->rchild);
else
free(T);
}
完整代码如下:
#include"stdio.h"
#include"stdlib.h"
typedef int datatype;
typedef struct innode
{
datatype data;
struct innode *lchild,*rchild;
}bitree;
int i,j;
bitree *creatbitree()//前序遍历的数值来创建树——递归
{
char ch;
bitree *root;
ch=getchar();//用于接收输入的数值
if(ch=='*') return NULL;//用*来判断是否为空
else{
root=(bitree *)malloc(sizeof(bitree));
root->data=ch;//赋值
root->lchild=creatbitree();//左子树
root->rchild=creatbitree();//右子树
}
return root;
}
int depthbitree(bitree *T)//测量树的深度
{
if(T==NULL) return 0;
else{
int leftheighter=depthbitree(T->lchild);
int rightheighter=depthbitree(T->rchild);
return (leftheighter > rightheighter?leftheighter+1:rightheighter+1);
}
}
int leaf_count(bitree *T)//测量叶子的数量
{
if(T==NULL) return 0;
else if(!T->lchild&&!T->rchild)//如果左右结点都为空则他就是叶子结点
return 1;
else return leaf_count(T->lchild)+leaf_count(T->rchild);
}
int countbitree(bitree *T)//测量总的结点个数
{
if(T==NULL)
return 0;
else{
return 1+countbitree(T->lchild)+countbitree(T->rchild);
}
}
bitree *copy(bitree *T)//复制树
{
if(T==NULL)
return NULL;
else{
bitree *temp;
temp=(bitree *)malloc(sizeof(bitree));
temp->data=T->data;
temp->lchild=copy(T->lchild);
temp->rchild=copy(T->rchild);
return temp;
}
}
int preorder(bitree *T)//前序遍历序列 (根左右)
{
if(T==NULL)
return 0;
else{
printf("%c ",T->data);//先输出根节点
preorder(T->lchild);
preorder(T->rchild);
}
}
int inorder(bitree *T)//中序遍历序列 (左根右)
{
if(T==NULL)
return 0;
else{
inorder(T->lchild);//先输出左孩子
printf("%c ",T->data);
inorder(T->rchild);
}
}
int postorder(bitree *T)//后序遍历序列 (左右根)
{
if(T==NULL)
return 0;
else{
postorder(T->lchild);//先输出左孩子
postorder(T->rchild);
printf("%c ",T->data);
}
}
void displaybitree(bitree *T)//广义表输出
{
if (T == NULL) return;
printf("%c", T->data);
if (T->lchild == NULL && T->rchild == NULL)//判断是否是叶子节点
return;
printf("(");
displaybitree(T->lchild);
printf(",");
displaybitree(T->rchild);
printf(")");
return;
}
bitree *Delete(bitree *T)//删除树
{
if(T->lchild)
Delete(T->lchild);
else if(T->rchild)
Delete(T->rchild);
else
free(T);
}
main()
{
bitree *T;
T=(bitree *)malloc(sizeof(bitree));
T->lchild=NULL;
T->rchild=NULL;
puts("请输入树的前序遍历序列");
T=creatbitree();
int n=depthbitree(T);
int m=leaf_count(T);
int l=countbitree(T);
puts("树创建完成");
puts("前序输出为");
printf("\t\t");
preorder(T);
puts("\n中序输出为");
printf("\t\t");
inorder(T);
puts("\n后序输出为");
printf("\t\t");
postorder(T);
puts("\n广义表输出");
printf("\t\t");
putchar('(');
displaybitree(T);
printf("\n高度%d\n叶子%d\n总结点%d\n",n,m,l);
Delete(T);
puts("删除成功");
}