数据结构之二叉树之二叉链表树代码实现

上个博客整理了二叉树的基础知识,这里是链接:二叉树的一些基本知识

了解到基本要点和基本结构后,我们来实现一下这个数据结构:

首先我们得了解到这个数据结构的单体是什么样子的,他单体包括了数据和两个指向左右孩子的指针
所以我们用结构体写出来这个二叉树节点:

typedef struct treenode {
	char data;
	struct treenode* Lchild;
	struct treenode* Rchild;
}TREE,*LPTREE;

因为这个节点名字太长了,我就起个别名,这里要注意的是我的 treenode*这个类型的起别名方式
一般来说LPXXXXX代表一个一级指针

然后就是创建一个这样的节点的函数
需要的是分配空间,赋值数据,指针置空初始化
接下来是代码

LPTREE createnode(char data) {
	LPTREE newnode = (LPTREE)malloc(sizeof(TREE));
	newnode->data = data;
	newnode->Lchild = NULL;
	newnode->Rchild = NULL;
	return newnode;
}

树的节点能够创建,那么就是连接各个节点,成为一个树。
需要参数的是父节点,左节点,右节点。
然后就是指针指向的问题,比如a节点作为父节点,b为左孩子,c为右孩子,
我就需要的是将a的左孩子指针指向b,右孩子指针指向c
那么实现一下这个代码:

void tree(LPTREE dad, LPTREE left, LPTREE right) {
	dad->Lchild = left;
	dad->Rchild = right;
}

那么这个树建立需要的函数我们已经实现好了,接下来是,遍历的问题,这节我采用递归的方法实现,虽然不好理解但是代码少,具体我会再注释的:
先实现一下打印当前节点的函数:

void printnode(LPTREE node) {
	printf("%c\t", node->data);
}

接下来是前序遍历,看我上一个博客,前序遍历是根 左 右,所以我们走到根节点就打印,然后访问左节点,以这个节点作为根节点,打印一下,然后走到没有左节点的时候,访问右节点,右节点作为根节点。。。。。循环往复,这就是递归实现

void printbypre(LPTREE root) {
	if (root != NULL) {//根节点不为空的时候
		printnode(root);//先打印根节点
		printbypre(root->Lchild);//打印过根节点,然后就访问左节点,吧左节点当作下一个的父节点
		printbypre(root->Rchild);//这个应该就是没有左节点的时候就返回到这里来了,也就是开始以右节点为根节点往下递归
	}
}

我们来创建这样的树来检查一下前序遍历:
在这里插入图片描述
主函数:

int main() {
	LPTREE A = createnode('A');
	LPTREE B = createnode('B');
	LPTREE C = createnode('C');
	LPTREE D = createnode('D');
	LPTREE E = createnode('E');
	LPTREE F = createnode('F');
	LPTREE G = createnode('G');
	tree(A, B, C);
	tree(B, D, NULL);
	tree(D, NULL, E);
	tree(C, NULL, F);
	tree(F, G, NULL);
	printf("前序遍历:\n");
	printbypre(A);

在这里插入图片描述
效果图
证明是正确的
那么, 中序遍历是,左 根 右 ,那么就是先是访问到最左边的节点作为根节点打印,然后它的根节点打印,返回到根节点(递归回去),然后访问右孩子的节点,循环往复,那么实现过来其实跟上面的没什么区别
代码:

void printbymid(LPTREE root) {
	if (root != NULL) {
		printbypre(root->Lchild);
		printnode(root);
		printbypre(root->Rchild);
	}
}

效果图:
在这里插入图片描述
聪明的小伙伴已经发现了一些亮点,只要调换顺序就可以了,当然你可以死背这个模板,但是最好还是理解一下这个递归过程,画画图,理解一下:

void printbyhou(LPTREE root) {
	if (root != NULL) {
		printbypre(root->Lchild);
		printbypre(root->Rchild);
		printnode(root);
	}
}

效果图:
在这里插入图片描述


其实吧,这样的结构跟链表十分相似,所以学过链表结构很容易掌握,不过不容易理解的就是递归遍历这个过程了吧。
好了今天的数据结构二叉树的博客就到这了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值