#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode{
char data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
BiTree create(BiTree T); //先序建立二叉树
void InOder(BiTree T); //中序遍历,左根右
BiTree copy(BiTree T, BiTree NewT); //复制二叉树
int depth(BiTree T); //计算二叉树的深度
int count(BiTree T); //统计二叉树中结点的个数
int leadCount(BiTree T); //计算二叉树叶子节点数
int main()
{
BiTree T = (BiTree)malloc(sizeof(BiTNode));
T = create(T);
InOder(T);
printf("\n");
BiTree T2 = (BiTree)malloc(sizeof(BiTNode));
T2 = copy(T, T2);
InOder(T2);
printf("\n二叉树的深度为:%d\n", depth(T));
printf("二叉树中的结点个数为:%d\n", count(T));
printf("叶子结点数为:%d\n",leadCount(T));
return 0;
}
//先序建立二叉树
BiTree create(BiTree T)
{
char data;
scanf("%c",&data);
if(data == '#')
T = NULL;
else{
T= (BiTree)malloc(sizeof(BiTNode));
T->data = data;
T->lchild = create(T->lchild);
T->rchild = create(T->rchild);
}
return T;
}
//中序遍历,左根右
void InOder(BiTree T)
{
if(T){
InOder(T->lchild);
printf("%c ",T->data);
InOder(T->rchild);
}
}
//复制二叉树
BiTree copy(BiTree T, BiTree NewT)
{
if(T == NULL){
NewT = NULL;
}else{
NewT = (BiTree)malloc(sizeof(BiTNode));
NewT->data = T->data;
NewT->lchild = copy(T->lchild, NewT->lchild);
NewT->rchild = copy(T->rchild, NewT->rchild);
}
return NewT;
}
//计算二叉树的深度
int depth(BiTree T)
{
if(T==NULL)
return 0;
else{
int m = depth(T->lchild);
int n = depth(T->rchild);
if(m>n) return m+1; //加1是加的根结点这一层
else return n+1;
}
}
//统计二叉树中结点的个数
int count(BiTree T)
{
if(T==NULL)
return 0; //空树就返回0
else{
//如果是一棵树,就递归调用自己计算自己的结点个数再+1(根结点本身)
return count(T->lchild)+count(T->rchild)+1;
}
}
//计算二叉树叶子节点数
int leadCount(BiTree T)
{
if(T == NULL) //空树
return 0;
if(T->lchild == NULL && T->rchild == NULL) //左右都为空,叶子结点
return 1;
else{ //非空树,返回左叶子+右叶子,无需再+1,因为若有左右结点则必不是叶子结点
return leadCount(T->lchild) + leadCount(T->rchild);
}
}
C语言二叉树遍历算法的应用
最新推荐文章于 2024-07-20 22:11:56 发布