#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
int m=0;
typedef struct BiTNode
{
char data;
BiTNode *lchild;
BiTNode *rchild;
}BiTNode,*BiTree;//二叉树的结构体定义
void CreateBiTree(BiTree &T)
{
char ch;
ch=getchar();
if(ch==' ') T=NULL;
else
{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(-1);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}//创建二叉树
void PreOrderTraverse(BiTree T)
{
if(T)
{
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}//先序遍历二叉树
void InOrderTraverse(BiTree T)
{
if(T)
{
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
}//中序遍历二叉树
void PostOrderTraverse(BiTree T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
}//后序遍历二叉树
void change(BiTree&T)
{
BiTree temp;
if(T)
{
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
change(T->lchild);
change(T->rchild);
}
}//交换左右子树
void printfleaf(BiTree T)
{
if(T)
{
if(!T->lchild &&!T->rchild )
printf("%c",T->data );
printfleaf(T->lchild );
printfleaf(T->rchild );
}
}//输出二叉树所有的叶子结点
int count(BiTree T)
{
int n1=0,n2=0;
if(T==NULL)
return 0;
else
{
n1=count(T->lchild);
n2=count(T->rchild);
return(n1+n2+1);
}
}//二叉树结点数
int countleaf(BiTree T)
{
if(T)
{
if(!T->lchild&&!T->rchild)
++m;
countleaf(T->lchild);
countleaf(T->rchild);
}
return 1;
}//二叉树叶子结点数
int high(BiTree T)
{
int h1=0,h2=0;
if(T==NULL)
return 0;
else
{
h1=high(T->lchild);
h1=h1+1;
h2=high(T->rchild);
h2=h2+1;
if(h1>h2)
return(h1);
else
return(h2);
}
}//二叉树的高度
int main()
{
int e,n;
BiTNode *T;
printf("先序创建一颗二叉树(子树为空用空格表示): \n");
CreateBiTree(T);
e=count(T);
n=high(T);
countleaf(T);
printf("二叉树的结点数,叶子结点数,高度为: %d %d %d\n",e,m,n);
printf("二叉树的所有叶子结点数: \n");
printfleaf(T);
printf("\n");
printf("先序遍历二叉树: \n");
PreOrderTraverse(T);
printf("\n");
printf("中序遍历二叉树: \n");
InOrderTraverse(T);
printf("\n");
printf("后序遍历二叉树: \n");
PostOrderTraverse(T);
printf("\n");
change(T);
printf("左右子树交换后先序遍历: \n");
PreOrderTraverse(T);
printf("\n");
printf("左右子树交换后中序遍历: \n");
InOrderTraverse(T);
printf("\n");
printf("左右子树交换后后序遍历: \n");
PostOrderTraverse(T);
printf("\n");
}//主函数
运行效果