综合一位网友csdn,另外结合《大话数据结构》;
其中我对递归的理解也注释在一边。
可惜本程序是运行不起来的。但是大话数据结构的代码能够跑起来,但没必要纠结这个,掌握核心就行
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "string.h"
#define MAXSIZE 100
typedef int Status;
typedef char TElemType;
typedef char String[30];//0号存放数组长度
String StrT;//作为输入数组
int pos=1;
TElemType Nil=' ';
typedef struct BiLTNode //节点结构
{
TElemType data;
struct BiLTNode *lchild,*rchild;
}BiLTNode,*BiLTree;
Status InitBiLTree(BiLTree *T)
{
//对二叉树初始化
*T=NULL;
return 1;
}
Status Visit(TElemType e)
{
//打印节点
printf("%d",e);
return 1;
}
/ *构造二叉树* /
//构造二叉树的工具函数,其会生成一个数组,
//作为CreateBiLTree()的输入,当然
//也可以人为输入,但是为方便对二叉树的后续操作
//这里就简化了,将输入固定。
Status StrAssign(String StrT,char *s)
{
int i;
int j;
j=strlen(s);
if (j>MAXSIZE)
return 0;
else{
StrT[0]=j;
for (i=1;i<=j;i++){
StrT[i]=*(s+i-1);
}
return 1;
}
}
//创建二叉树:这里用先序遍历创建,并且此代码只能通
//过先序遍历方式创建,
//想通过更改else中得遍历顺序来创建中序遍历和后序遍历
//的二叉树是不行的,因为无法创建根节点,这是
//《大话数据结构》中的错误
Status CreateBiLTree(BiLTree *T)
{
TElemType ch;
if(*T==NULL)
return 0 ;
ch=StrT[pos++];
if (ch=='#')
*T=NULL;
else
{
*T=malloc(sizeof(struct BiLTNode));
if (*T==NULL)
{
exit(1);
}
else
{
(*T)->data=ch;
CreateBiLTree(&(*T)->lchild);
CreateBiLTree(&(*T)->rchild);
return 1;
}
}
}
/ *构造二叉树完毕* /
Status DestroyBiLTree(BiLTree *T)
{
if (*T==NULL)
return 0;
if ((*T)->lchild)
DestroyBiLTree(&(*T)->lchild);
if ((*T)->rchild)
DestroyBiLTree(&(*T)->rchild);
free(*T);
//释放内存空间,但*T这个变量还在.为避免*T误用,则需要*T=NULL;
//free与malloc连用,其针对的是具体的*T所指的存储空间,而
// *T=NULL针对的是指针变量
*T=NULL;
return 1;
}
int DepthBiLTree(BiLTree *T)
{
int ldepth,rdepth;
if (*T==NULL)
return 0;
if (!(*T)->lchild&&!(*T)->rchild)
return 1;
else{
ldepth=DepthBiLTree(&(*T)->lchild);
rdepth=DepthBiLTree(&(*T)->rchild);
return (ldepth>rdepth?ldepth:rdepth)+1;
//这里要加1操作.假设深度为2,
//而走到这步说明*T有孩子,
//则至少有*T和*T的孩子,所以深度返回值为2.
//另外,ldepth和rdepth相等,则返回相等的值
//我不这么理解,我现在对递归这么理解,任何需要用到递归的
//的地方,我只当成两层,以方便使用,开头判断一次,最后调用
//一次。对于此处求解深度,我开头判断是否只有根节点,然后求解左边深度,再
//再求解右边深度,最后+1
}
}
TElemType Root(BiLTree *T)
{
if (*T==NULL)
return Nil;
return (*T)->data;
}
void PreOrderTraverse(BiLTree *T)
{
if(*T==NULL)
exit(1);
Visit((*T)->data);
PreOrderTraverse(&(*T)->lchild);
PreOrderTraverse(&(*T)->rchild);
}
void InOrderTraverse(BiLTree *T)
{
if ((*T)==NULL)
exit(1);
InOrderTraverse(&(*T)->lchild);
Visit((*T)->data);
InOrderTraverse(&(*T)->rchild);
}
void PostOrderTraver(BiLTree *T)
{
if ((*T)==NULL)
exit(1);
PostOrderTraver(&(*T)->lchild);
PostOrderTraver(&(*T)->rchild);
Visit((*T)->data);
}
int main()
{
char *chars = "ABCD#K###E##CFI###G#J##";//全局变量
StrAssign(StrT,chars);
BiLTree *T;//T是双重指针
T = (BiLTree *)malloc(sizeof(BiLTree));
InitBiLTree(T);
CreateBiLTree(T);
printf("构造二叉树后,二叉树是否为空(1:是,0:不是)? %d\n",EmptyBiLTree(T));
printf("二叉树的深度为 %d\n",DepthBiLTree(T));
printf("二叉树的根为:%c\n",Root(T));
printf("前序递归遍历:");
PreOrderTraverse(T);
printf("\n");
printf("中序递归遍历:");
InOrderTraverse(T);
printf("\n");
printf("后序递归遍历:");
PostOrderTraverse(T);
printf("\n");
//销毁树
DestoryBiLTree(T);
printf("构造二叉树后,二叉树是否为空(1:是,0:不是)? %d\n",EmptyBiLTree(T));
return 0;
}