用c语言写二叉树(链表),初始化,创建,三种输出,判断叶子节点个数,叶子节点输出,层数判断

这篇博客展示了一段C语言代码,用于创建、初始化、遍历和输出二叉树。代码包括先序创建、判断树层数、计算叶子节点数量、输出叶子节点以及先序、中序和后序遍历等功能。用户可以通过输入先序序列来构建二叉树,并观察其结构和属性。
摘要由CSDN通过智能技术生成

有什么疑问大家评论区提出吧,我直接把整个代码给大家:

​
#include<stdio.h>
#include<stdlib.h>
typedef struct tree{
	char data;
	struct tree *lchild,*rchild;
}BiTNode,*BiTree;
void Inittree(BiTree *T)          //初始化,下面函数引用的都是二重指针// 
{
	*T=(BiTree)malloc(sizeof(BiTNode));
	(*T)->data=NULL;
	(*T)->lchild=NULL;
	(*T)->rchild=NULL;
}
void creattree(BiTree *T)        //先序创建// 
{
	char ch;
	ch=getchar();
	if(ch=='#')
	{
		*T=NULL;
		return;
	}else{
		*T=(BiTree)malloc(sizeof(BiTNode));
		(*T)->data=ch;
		creattree(&((*T)->lchild));
		creattree(&((*T)->rchild));
	}
}
int judgetree(BiTree *T)        //判断二叉树有几层,先序遍历// 
{
	int llength,rlength,max;
    if((*T)!=NULL)
	{
	   llength=judgetree(&(*T)->lchild);
	   rlength=judgetree(&(*T)->rchild);
	   max=llength>rlength?llength:rlength;
	   return max+1; 	
	}else{
		return 0;
	}	
}
void judgeleaf(BiTree *T,int *leaf)           //判断二叉树有几个叶子,先序遍历,这里用一重指针leaf是为了不被递归判断的return leaf所返回为零// 
{
	if((*T)!=NULL)
	{
		judgeleaf(&(*T)->lchild,leaf);
		judgeleaf(&(*T)->rchild,leaf);
		if((*T)->lchild==NULL&&(*T)->rchild==NULL)
		{
	        (*leaf)++;
	    }
	}
}
void printleaf(BiTree *T)           //输出叶子节点,思路和判断有几个叶子节点是一样的// 
{
    if((*T)!=NULL)
	{
        printleaf(&(*T)->lchild);
		printleaf(&(*T)->rchild);
		if((*T)->lchild==NULL&&(*T)->rchild==NULL)
		printf("%c",(*T)->data);	
    }  	
} 
void visit(char a)       //输出函数// 
{
	printf("%c",a);
}
void proprinttree(BiTree *T)            //先序输出// 
{
	if(*T!=NULL)
	{
        visit((*T)->data);
		proprinttree(&(*T)->lchild);
		proprinttree(&(*T)->rchild);	
	}
}
void midprinttree(BiTree *T)           //中序输出// 
{
	if(*T!=NULL)
	{
		midprinttree(&(*T)->lchild);
		visit((*T)->data);
		midprinttree(&(*T)->rchild);
	}
}
void lastprinttree(BiTree *T)        //后序输出// 
{
	if(*T!=NULL)
	{
		lastprinttree(&(*T)->lchild);
		lastprinttree(&(*T)->rchild);
		visit((*T)->data);
	}
}
int main()
{
	int leaf=0;        //定义叶子初始化为零// 
	BiTNode *T;        //定义根// 
	Inittree(&T);
	printf("请按照先序序列输入二叉树:\n");
	creattree(&T); 
	printf("此二叉树有%d层\n",judgetree(&T)); 
	judgeleaf(&T,&leaf);
	printf("此二叉树的叶子有%d个:\n",leaf);
	printf("叶子节点分别是:\n");
	printleaf(&T);
	printf("\n"); 
	printf("按照先序输出二叉树:\n"); 
	proprinttree(&T);
	printf("\n");
	printf("按照中序输出二叉树:\n"); 
	midprinttree(&T); 
	printf("\n");
	printf("按照后序输出二叉树:\n"); 
	lastprinttree(&T); 
	printf("\n");
	return 0;
}

​

  • 12
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新城已无旧少年_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值