文章目录
先导知识
二级指针
以上图形分为三层:
第一层是指针的形式:
共分为三级指针、二级指针、一级指针、变量
第二层是里面所存储的内容:
三级指针中存储的内容为二级指针的地址
二级指针中存储的内容为一级指针的地址
一级指针中存储的内容为变量的地址
变量中存储的内容为赋予的变量值
我们也可以根据一下代码来看
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.【第三章】《二叉树的存储结构》