浅谈二叉树(C语言)

二叉树作为树这种数据结构的中非常经典的一种非线性不连续的数据结构,因其优良的时间复杂度而被广泛使用,在这篇文章中我们就来讲述一下二叉树的生成以及遍历。
例如下图中的二叉树我们如何解决它们的存储问题?
在这里插入图片描述
这里我们可以在输入时控制一下输入格式,就是我们可以在输入时先输入左子树在一个支路的左子树输入完成后设置一个结束标志再继续输入右子树,上图中我们就可以在输入是按照下面的格式进行输入:
ABC##DE###FG###
下面我们就直接看代码吧,代码中有些递归思想,如果有啥不懂的可以进行一下变量跟踪,这样看着也会更清晰一些。

void creatB_TREE(B_TREE **root) {
	char ch;
	scanf("%c",&ch);

	if (ch == '#') {
		*root = NULL;
	} else {
		*root = (B_TREE *) calloc(sizeof(B_TREE), 1);
		(*root)->data = ch;
		creatB_TREE(&((*root)->leftChild));
		creatB_TREE(&((*root)->rightChild));
	}
}

这个函数写完之后我们来看一下二叉树的遍历,二叉树的遍历分为三种分别是先根序,中根序,后根序。看起来是三种类型其实他们的代码只有一点点的差别,我们以“先根序”为例来讲一下二叉树的遍历。
所谓先根序就是先访问根节点将其中的数据取出然后将根节点的左子树当成根节点对待继续访问其中的数据左子树访问完后再去访问右子树。这其中也有些递归思想,建议大家进行一下变量跟踪方便理解。

void preRootOrder(B_TREE *root) {
	if (root) {
		printf("[%c] ",root->data);
		preRootOrder(root->leftChild);
		preRootOrder(root->rightChild);
	}
}

理解上面的代码后我们就直接跟上中根序和后根序的代码,它们的差别很小,只有什么时候取出根节点中的数据这点小区别。

void posteriorRootOrder(B_TREE *root){
	if (root) {
		posteriorRootOrder(root->leftChild);
		posteriorRootOrder(root->rightChild);
		printf("[%c] ",root->data);
	}	
}

void middleRootOrder(B_TREE *root) {
	if (root) {
		middleRootOrder(root->leftChild);
		printf("[%c] ",root->data);
		middleRootOrder(root->rightChild);		
	}

}

最后我们来看看完整代码以及运行情况:

#include <stdio.h>
#include <malloc.h>

typedef struct B_TREE {
	char data;
	struct B_TREE *leftChild;
	struct B_TREE *rightChild;
}B_TREE;

void creatB_TREE(B_TREE **root);
void preRootOrder(B_TREE *root);
void middleRootOrder(B_TREE *root);
void posteriorRootOrder(B_TREE *root);

void posteriorRootOrder(B_TREE *root){
	if (root) {
		posteriorRootOrder(root->leftChild);
		posteriorRootOrder(root->rightChild);
		printf("[%c] ",root->data);
	}	
}

void middleRootOrder(B_TREE *root) {
	if (root) {
		middleRootOrder(root->leftChild);
		printf("[%c] ",root->data);
		middleRootOrder(root->rightChild);		
	}

}

void preRootOrder(B_TREE *root) {
	if (root) {
		printf("[%c] ",root->data);
		preRootOrder(root->leftChild);
		preRootOrder(root->rightChild);
	}
}

void creatB_TREE(B_TREE **root) {
	char ch;
	scanf("%c",&ch);

	if (ch == '#') {
		*root = NULL;
	} else {
		*root = (B_TREE *) calloc(sizeof(B_TREE), 1);
		(*root)->data = ch;
		creatB_TREE(&((*root)->leftChild));
		creatB_TREE(&((*root)->rightChild));
	}
}

int main() {
	B_TREE *root = NULL;

	printf("please input your data,'#' is symbol of over:"); 
	creatB_TREE(&root);

	printf("preRootOrder:");
	preRootOrder(root);
	printf("\n");

	printf("middleRootOrder:");
	middleRootOrder(root);
	printf("\n");

	printf("posteriorRootOrder:");
	posteriorRootOrder(root);
	printf("\n");

	return 0;

}

在这里插入图片描述
有什么问题可以在下面留言,谢谢观看。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值