#include <string.h>
#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode* lchild;
struct BiTNode* rchild;
}BiTNode, *BiTree;
void createBiTree(BiTree &T)
{
char data;
data = getchar();
if(data == '#')
{
T = NULL;
}
else
{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=data;
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 destroyTraverse(BiTree &T) //销毁二叉树递归
{
if(T)
{
destroyTraverse(T->lchild);
destroyTraverse(T->rchild);
free(T);
T=NULL;
}
}
int lengthTraverse(BiTree &T) //树的深度递归
{
int ldepth;
int rdepth;
if(T==NULL)
{
return 0;
}
ldepth=lengthTraverse(T->lchild);
rdepth=lengthTraverse(T->rchild);
return (ldepth>rdepth)? (ldepth+1):(rdepth+1);
}
int leafnumberTraverse(BiTree &T) //求树的叶子节点递归
{
if(T==NULL)
{
return 0;
}
if(T->lchild==NULL&&T->rchild==NULL)
return 1;
return leafnumberTraverse(T->lchild)+leafnumberTraverse(T->rchild);
}
void exchangechild(BiTree &T) //交换树的左右孩子递归
{
BiTree temp;
if(T)
{
temp=NULL;
if(T->lchild||T->rchild)
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
exchangechild(T->lchild);
exchangechild(T->rchild);
}
}
int main()
{
BiTree T = NULL;
printf("请输入需要建立二叉树的序列:\n"); //大兄弟,如果不能显示那么就是你输入的问题:尝试输入 ABE###CD### 意思就是A( B(E),C(D) )
createBiTree(T);
printf("先序递归遍历: ");
preOrderTraverse(T);
printf("\n中序递归遍历:");
inOrderTraverse(T);
printf("\n后序递归遍历:");
postOrderTraverse(T);
printf("\n树的高度为:%3d\n", lengthTraverse(T));
printf("\n树的 叶子节点个数为:%3d\n",leafnumberTraverse(T));
exchangechild(T);
printf("\n对交换后的数进行先序递归遍历:\n ");
preOrderTraverse(T);
return 0;
}