二叉树部分基本操作的C语言递归实现

#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode {
	char data;
	struct BiTNode* lchild;
	struct BiTNode* rchild;
}BiTNode, * Bitree;

void Create_BinaryTree(Bitree* T)//递归创建二叉树
{
	char c;
	scanf("%c", &c);
	fflush(stdin);
	if (c == '#')
	{
		*T = NULL;
		return;
	}
	else {
		if (!(*T = (BiTNode*)malloc(sizeof(BiTNode))))
		{
			return;
		}
		(*T)->data = c;
		Create_BinaryTree(&((*T)->lchild));
		Create_BinaryTree(&((*T)->rchild));
	}
}
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);
	}
}
void Copy(Bitree T, Bitree* NewT)//复制二叉树
{
	if (T == NULL)
	{
		*NewT = NULL;
		return;
	}
	else {
		*NewT = (BiTNode*)malloc(sizeof(BiTNode));
		(*NewT)->data = T->data;
		Copy(T->lchild, &((*NewT)->lchild));
		Copy(T->rchild, &((*NewT)->rchild));
	}
}
int Depth(Bitree T)//计算二叉树深度
{
	if (T == NULL)
	{
		return 0;
	}
	else {
		int L = Depth(T->lchild);
		int R = Depth(T->rchild);
		return L > R ? L + 1 : R + 1;
	}
}
int NodeCount(Bitree T)//计算二叉树总结点数
{
	if (T == NULL)
	{
		return 0;
	}
	else {
		return NodeCount(T->lchild) +
			NodeCount(T->rchild) + 1;
	}
}
int LeafCount(Bitree T)//计算二叉树叶子结点数
{
	if (T == NULL)
	{
		return 0;
	}
	if (T->lchild == NULL && T->rchild == NULL)
	{
		return 1;
	}
	else {
		return LeafCount(T->lchild) +
			LeafCount(T->rchild);
	}
}
int main()
{
	Bitree T;
	Create_BinaryTree(&T);
	printf("先序遍历:");
	PreOrderTraverse(T);
	printf("\n");
	printf("中序遍历:");
	InOrderTraverse(T);
	printf("\n");
	printf("后序遍历:");
	PostOrderTraverse(T);
	printf("\n叶子节点数:%d\n总结点数:%d\n二叉树深度:%d", LeafCount(T),NodeCount(T),Depth(T));
	printf("\n");
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值