C语言递归实现二叉树的建立
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言递归实现二叉树的建立,先序,中序,后序遍历操作及结点数和树的高度计算
#include
#define ElemType char
//节点声明,数据域、左孩子指针、右孩子指针
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序建立二叉树
BiTree CreateBiTree(){
char ch;
BiTree T;
scanf("%c",&ch);
if(ch=='#')T=NULL;
else{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
T->lchild = CreateBiTree(); T->rchild = CreateBiTree(); }
return T;//返回根节点
}
//先序遍历二叉树
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);
}
}
//求树的结点数
int numofnode(BiTree T)
{
if (NULL == T)
return 0;
else
return (numofnode(T->lchild) +
numofnode(T->rchild)+1); }
//求树的深度
int depth(BiTree T)
{
int h,lh,rh;
if (NULL == T)
h = 0;
else
{
lh=depth(T->lchild);
rh=depth(T->rchild);
if (lh >= rh)
h = lh+1;
else
h = rh+1;
}
return h;
}
//求叶子结点数
int leafNum(BiTree T) {
int Lleaf,Rleaf;
if(T==NULL) return 0;
else if(T->lchild==NULL&&T->rchild==NULL) return 1; else
{
Lleaf=leafNum(T->lchild);
Rleaf=leafNum(T->rchild);
return(Lleaf+Rleaf);
}
}
void main(){
BiTree T;
T = CreateBiTree();//建立
printf("先序遍历:\n");
PreOrderTraverse(T);//输出
printf("\n");
printf("中序遍历:\n");
InOrderTraverse(T);//输出
printf("\n");
printf("后序遍历:\n");
PostOrderTraverse(T);//输出
printf("\n");
printf("该树结点数为:\n%d\n",numofnode(T));
printf("树的深度为:\n%d\n",depth(T));
printf("该树叶子结点数为:\n%d\n",leafNum(T)); }
演示图例:
#代表孩子为空