C语言 创建二叉树及对二叉树的操作

代码都是书上的。
需要注意的是怎么输入。
在这里插入图片描述
第一行 为自己输入的数据,在创建的二叉树中数据域为char型,故空格和enter键也会被存入二叉树数据中。‘#’号总比二叉树数据结点多一个,不然一直在输入,无法进入输出。输出是中序遍历打印的。
在这里插入图片描述
根据上面的输入数据可以画出自己创建的二叉树(上图)。这是草稿纸上的操作,代码结果只输出中序遍历结果。

完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct BiTNode
{
	char data;//结点的数据域 
	struct BiTNode *lchild,*rchild;//左右孩子指针 
}BiTNode,*BiTree;

void CreateTree(BiTree &T)//创建二叉树,这里是先序遍历的顺序建立的二叉链表  递归形式 
{
	char ch,trmp;
	scanf("%c",&ch);//输入链表数据 
	if(ch == '#')//如果出现输入的是#,终止递归。终止递归条件 
		T = NULL;
	else
	{
		T = (BiTNode*)malloc(sizeof(BiTNode));//申请一个根结点 
		T->data = ch;//对根结点进行赋值 
		CreateTree(T->lchild);//递归创建左子树 
		CreateTree(T->rchild);//递归创建右子树 
	}
}

bool TreeEmpty(BiTree T)//判断二叉树是否为空 
{
	if(T == NULL)//bool类型,如果二叉树为空,返回true,否则返回false 
		return true;
	return false;
}

void InOrderTraverse(BiTree T)//打印二叉树 ,中序遍历二叉树的递归算法 
{
	if(T)//递归终止条件是T为NULL 
	{
		InOrderTraverse(T->lchild);//中序遍历左子树 
		printf("%c  ",T->data);//输出打印根结点 
		InOrderTraverse(T->rchild);//中序遍历右子树 
	}
}

void CopyTree(BiTree T,BiTree &NewT)//复制一颗和T完全相同的二叉树 
{
	if(T == NULL)//递归终止条件 
	{
		NewT = NULL;
		return ;
	}
	else
	{
		NewT = (BiTNode*)malloc(sizeof(BiTNode));//申请一个根结点 
		NewT->data = T->data;//复制根结点 
		CopyTree(T->lchild,NewT->lchild);//递归复制左子树 
		CopyTree(T->rchild,NewT->rchild);//递归复制右子树 
	}
}

int Depth(BiTree T)//计算二叉树T的深度 
{
	int m = 0,
		n = 0;//定义两个变量 
	if(TreeEmpty(T))//递归终止条件 
		return 0;
	else
	{
		m = Depth(T->lchild);//递归计算左子树的深度记为m 
		n = Depth(T->rchild);//递归计算右子树的深度记为n 
		if(m>n)//二叉树的深度为m与n的较大者加1 
			return m+1;
		return n+1;
	}
}

int NodeCount(BiTree T)//统计二叉树T中的结点的个数 
{
	if(T == NULL)//递归终止条件 
		return 0;
	else//结点个数为左子树的结点个数+右子树的结点个数 
		return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}

int main()
{
	BiTree T;//创建一个空二叉树 
	CreateTree(T);// 创建二叉树 
	InOrderTraverse(T);//打印二叉树 中序遍历
	printf("\n");
	BiTree NewT;//创建一个新二叉树 
	CopyTree(T,NewT);//复制二叉树 
	InOrderTraverse(NewT);
	printf("\n");
	printf("%d\n",Depth(T));//二叉树T的深度 
	printf("%d\n",NodeCount(T));//二叉树的结点个数 
	return 0;
}

(完)

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值