二叉树的基本操作

二叉树是树中最简单的一种形式,每棵树也都可以通过子兄排列为二叉树形式,则下面将介绍二叉树的一些基本操作,分别是创建,复制,深度计算,节点计算以及叶子计算

二叉树的创建

一下提供了手动输入字符的方法来创建一个存放字符的二叉树,并规定当输入#时,标志着该节点为空

Bitree* InitBitRootNode() {
	Bitree* T = (Bitree*)malloc(sizeof(Bitree));
	T->lchild = T->rchild = NULL;
	return T;
}
void CreatBitNode(Bitree** T) {
	char data;
	scanf("%c", &data);
	getchar();	//清空缓冲区,否则enter建也会被当作一个输入
	if (data == '#') 
		(*T) = NULL;
	else {
		(*T) = InitBitRootNode();
		(*T)->data = data;
		CreatBitNode(&((*T)->lchild));
		CreatBitNode(&((*T)->rchild));
	}
}

之所以采用双指针形参,是为了当输入#时使节点变为空,若采用单指针形式,则对T本身来说相当于传值调用,调用结束后不会改变T的值

二叉树的拷贝

Bitree* CopyBitree(Bitree* T) {
	Bitree* newT = InitBitRootNode();
	if (!T) {
		newT = T;
		return newT;
	}
	else {
		newT->data = T->data;
		newT->lchild = CopyBitree(T->lchild);
		newT->rchild = CopyBitree(T->rchild);
	}
	return newT;
}

二叉树的拷贝采用递归算法,首先判断传入的被拷贝参数是否为空,若为空则返回空指针

否则,创建一个新的树节点存放被拷贝节点数值,并对新节点的左右子节点也分别拷贝

二叉树深度的计算

int Depth(Bitree* T) {
	if (!T) 
		return 0;
	else {
		int i = Depth(T->lchild);
		int j = Depth(T->rchild);
		return (i > j ? i : j) + 1;
	}
}

采用递归算法,从根节点开始一直搜索到叶子节点,然后开始返回值,返回值是已找到的最大深度加一,加一是因为自己这个节点代表了一个层数

二叉树节点的计算

int BiTreeNodeCount(Bitree* T) {
	if (!T)
		return 0;
	else 
		return BiTreeNodeCount(T->lchild) + BiTreeNodeCount(T->rchild) + 1;
}

二叉树叶子的计算

int BiTreeLeaftCount(Bitree* T) {
	if (!T)
		return 0;
	else if (T->lchild == NULL && T->rchild == NULL)
		return 1;
	else
		return BiTreeLeaftCount(T->lchild) + BiTreeLeaftCount(T->rchild);
}

相对于计算节点数,计算叶子数需要判断的不仅有该节点是否为空,还要判断该节点的左右子节点是否为空,若该节点为空,则说明该节点为叶子节点的子节点,已经没有递归的必要;若左右子节点为空则说明该节点是一个叶子,返回数值一,否则进入递归

效果展示

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值