#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
char data;
struct node *rchild,*lchild;
}node,*linklist;
void preorder_create(linklist *l)//先序创建二叉树
{
char ch,temp;
scanf("%c",&ch);
temp=getchar();
if(ch=='#')
{
*l=NULL;
}
else
{
(*l)=(node*)malloc(sizeof(node));
(*l)->data=ch;//每个节点进去都要进行下面两个递归,即输入左子节点和右子节点,而每个内部递归也要进行
printf("请输入%c的左子节点\n",ch);
preorder_create(&((*l)->lchild));//*l->rchild当于进行上面的操作、当a的子节点变成#时,这个递归退出,进行下一个递归,即下一语句
printf("请输入%c的右子节点\n",ch);
preorder_create(&((*l)->rchild));//当*l->lchild不为#时一直进行该递归,直到满足条件,退出递归,结束该函数
}
}
void preorder_traverse(linklist *l)//先序遍历输出
{
if((*l)==NULL)
{
return;
}
printf("%4c",(*l)->data);//从头结点开始,进行左右递归,左右递归的内部再继续进行
preorder_traverse(&((*l)->lchild));//每个内部也要进行左右两个递归
preorder_traverse(&((*l)->rchild));
}
void inorder_traverse(linklist *l)//中序遍历输出
{
if((*l)==NULL)
{
return;
}
inorder_traverse(&((*l)->lchild));
printf("%4c",(*l)->data);
inorder_traverse(&((*l)->rchild));
}
void postorder_traverse(linklist *l)//后序遍历输出
{
if((*l)==NULL)
{
return;
}
postorder_traverse(&((*l)->lchild));
postorder_traverse(&((*l)->rchild));
printf("%4c",(*l)->data);
}
int TreeDeep(linklist *l)//求二叉树的深度
{
int deep=0;
if(*l)
{
int leftdeep=TreeDeep(&((*l)->lchild));
int rightdeep=TreeDeep(&((*l)->rchild));
deep=leftdeep>=rightdeep?leftdeep+1:rightdeep+1;
}
return deep;
}
int life_count(linklist *l)//求叶子节点的个数
{
static int num=0;
if((*l)==NULL)//此递归方式与上面相同,保持整个递归可以正常运行
{
return;
}
else
{
if(((*l)->lchild)==NULL&&((*l)->rchild)==NULL)//对递归的每个节点进行判断,成立累加
{
num++;
}
life_count(&((*l)->lchild));
life_count(&((*l)->rchild));
}
return num;//return语句表示整个函数的最终结果为一个值,可以通过变量赋给
}
int main()
{
linklist a;
preorder_create(&a);
preorder_traverse(&a);
inorder_traverse(&a);
int deepth,num;
deepth=TreeDeep(&a);
printf("%d",deepth);
num=life_count(&a);
printf("%d",num);
//postorder_traverse(&a);
return 0;
}