从零开始学数据结构系列之第三章《二叉树链式结构及实现1》

文章目录


先导知识

二级指针


以上图形分为三层:

第一层是指针的形式:

​   共分为三级指针、二级指针、一级指针、变量

第二层是里面所存储的内容:

​   三级指针中存储的内容为二级指针的地址

​   二级指针中存储的内容为一级指针的地址

​   一级指针中存储的内容为变量的地址

​   变量中存储的内容为赋予的变量值

我们也可以根据一下代码来看

c 复制代码
#include <stdio.h>

int main(void)
{
    int x = 5;
	int *a = &x;
	int **b = &a;
	printf("%p->%p ->%d\r\n",&a,a,*a);
	printf("%p ->%p -->%d\r\n",b,*b,**b);
    return 0;
}

注意:这块一定一定要弄懂

例如啥,例如:指针,结构体这类的,不如你看不懂后面的代码的

不懂的话可以去查阅相关资料

例如可以去:
C语言相关内容
B站二级指针跳转
基于C语言指针的一些思考

或者其他地方进行一个查找

创建树

我们这边用的是链式结构

​   所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。

前序/中序/后序的递归结构遍历:是根据访问结点操作发生位置命名

NLR:前序遍历(Preorder Traversal 亦称先序遍历)------访问根结点的操作发生在遍历其左右子树之前。

LNR:中序遍历(Inorder Traversal)------访问根结点的操作发生在遍历其左右子树之中(间)。

LRN:后序遍历(Postorder Traversal)------访问根结点的操作发生在遍历其左右子树之后。

​   由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

c 复制代码
/*
*	为什么这里要用到二级指针,因为我们所创建的值是结构体指针变量,但是我们要改变结构体指针变量中嵌套的结构体指针变得的值,
所以才需要二级指针,这样才能改变一级指针中存储的地址内容,再加上这是我们再函数中要改变函数外的值,不然他的指向都是一样的
*注意,我们是要改变一级指针中的值
*注意,我们是要改变一级指针中的值
*可以去联想之前学的,怎么改变传递进函数中的值,这个与当时哪个类似
*/
void createTree(TreeNode** T,char* temp,int* index)
{
	char ch;
	ch = temp[*index];			//防止无限递归的一种方法,直接控制index的数值间接来控制
	(*index)++;

	if(ch == '#')				//模拟输入的假设情况,因为计算机不懂什么时候是为空,需要有标志来进行判断
		*T=NULL;
	else
	{
		*T = (TreeNode*)malloc(sizeof(TreeNode));	//修改一级指针的地址,为他开辟空间
		(*T)->data = ch;							//注意,该传递的值是二级指针,并且 ->符号的优先级比*号高
		createTree(&(*T)->lchild,temp,index);		//递归左、右树,同时要注意一下这个&(*T),传递一级指针的地址
		createTree(&(*T)->rchild,temp,index);
	}
}

往期回顾

1.【第一章】《线性表与顺序表》
2.【第一章】《单链表》
3.【第一章】《单链表的介绍》
4.【第一章】《单链表的基本操作》
5.【第一章】《单链表循环》
6.【第一章】《双链表》
7.【第一章】《双链表循环》
8.【第二章】《栈》
9.【第二章】《队》
10.【第二章】《字符串暴力匹配》
11.【第二章】《字符串kmp匹配》
12.【第三章】《树的基础概念》
13.【第三章】《二叉树的存储结构》

相关推荐
lsx2024061 分钟前
SQL SELECT 语句:基础与进阶应用
开发语言
小二·3 分钟前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic26 分钟前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it28 分钟前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康33 分钟前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神1 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
搬砖的小码农_Sky1 小时前
C语言:数组
c语言·数据结构
宅小海1 小时前
scala String
大数据·开发语言·scala
朝九晚五ฺ1 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
qq_327342731 小时前
Java实现离线身份证号码OCR识别
java·开发语言