#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int count,x;
int CreateBiTree(BiTree *T)
{//链式创建二叉树
char ch;
getchar();//吞回车
scanf("%c",&ch);
if(ch =='#')
{
*T = NULL; //递归结束,建空树
}
else
{
if(!(*T= (BiTree)malloc(sizeof(BiTNode))) )
exit(0);
(*T)->data=ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
return 1;
}
int PreOrderTraverse(BiTree T)
{//前序遍历
if(T == NULL)
return 1;
else
{
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
return 1;
}
int InOrderTraverse(BiTree T)
{//中序遍历
if(T == NULL) return 1;
else{
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
}
int PostOrderTraverse(BiTree T)
{//后序遍历
if(T == NULL) return 1;
else
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
}
int CountLeaf(BiTree root) //采用先序遍历的递归算法
{//统计二叉树中叶子结点的个数
if(root != NULL) //非二叉树的条件,还可以写成if(root)
{
if(!root->lchild && !root->rchild) //是叶子结点则统计并打印
{
count++;
printf("%c\n",root->data);
}
CountLeaf(root->lchild); //递归遍历左子树,直到叶子处
CountLeaf(root->rchild); //递归遍历右子树,直到叶子处
}
return 1;
}
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;
else
return n+1;
}
}
int main()
{
BiTree T;
int i;
printf("1----链式创建二叉树\n");
printf("2----先序遍历\n");
printf("3----中序遍历\n");
printf("4----后序遍历\n");
printf("5----计算二叉树的深度\n");
printf("6----统计二叉树中叶子结点的个数\n");
printf("若退出,请输入一个负数!\n\n");
while ( i>=0 )
{
printf("请输入操作代码:");
scanf("%d", &i);
if(i == 1)
{
CreateBiTree(&T);
printf("链式创建二叉树成功\n");
}
else if(i == 2)
{
if(PreOrderTraverse(T) )
printf("先序遍历成功\n");
}
else if(i == 3)
{
if( InOrderTraverse(T) )
printf("中序遍历成功\n");
}
else if(i == 4)
{
if( PostOrderTraverse(T) )
printf("后序遍历成功\n");
}
else if(i == 5)
{
if( CountLeaf(T) )
{
printf("统计成功!二叉树中叶子结点的个数:%d\n",count);
}
}
else if(i == 6)
{
if( Depth(T) )
{
x= Depth(T);
printf("深度为:%d\n",x);
}
}
else if(i < 0)
{
printf("退出成功!\n");
break;
}
}
return 0;
}
/*
注意点:
1. BiTNode :指的是结构体,相当于结点
BiTree :属于指针类型,可以将结点连接起来,所以在定义头结点时,使用指针指向头结点;
2. C语言中,想要指针实现实参和形参值的一致,Bitree*,(*T)->data,(*T):是指向头结点的指针;
3. getchar():吞并换行符(类似于回车之类的)
*/
二叉树-C语言
最新推荐文章于 2023-11-06 17:02:00 发布