最全宿友用一把王者的时间入门了【二叉树】,你又懂多少呢?乌拉(1),2024年大数据开发春招面试经历

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

  • 快上车🚘,握好方向盘跟我有一起打天下嘞!
  • 🚩数据结构专栏~~最最最重要就是要画图理解🚩
  • 🙏作者水平很有限,如果发现错误,可在评论区指正,感谢🙏
  • 🎉🎉欢迎持续关注!🎉🎉
    在这里插入图片描述
手把手教会你指针

请添加图片描述

🐾探究二叉树的意义

🎄1.为什么学二叉树?

  • 普通二叉树的增删查改没有意义
  • 存储数据结构复杂,不如用顺序表、链表

那我们还为什么学习它呢❓

  • 1️⃣为了后面学习更复杂的二叉树,打基础(搜索二叉树、AVL树、红黑树、B树…)
  • 2️⃣有很多二叉树的OJ算法题都是处在普通二叉树上

🐾二叉树链式结构的实现

🎄1.前置说明

  • 在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。
  • 由于现在大家对二叉树结构掌握还不够深入,为了降低学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究二叉树真正的创建方式。

下面我们来手搓一棵二叉树:

在这里插入图片描述

📜代码实现👇🏻:

typedef int BTDataType;
typedef struct BinaryTreeNode
{
	BTDataType data;// 存放数据域
	struct BinaryTreeNode\* left;
	struct BinaryTreeNode\* right;
}BTNode;

BTNode\* BuyNode(BTDataType x)
{
	BTNode\* node = (BTNode\*)malloc(sizeof(BTNode));
	assert(node);

	node->data = x;
	node->left = NULL;
	node->right = NULL;
}
BTNode\* CreatBinaryTree()
{
	BTNode\* node1 = BuyNode(1);
	BTNode\* node2 = BuyNode(2);
	BTNode\* node3 = BuyNode(3);
	BTNode\* node4 = BuyNode(4);
	BTNode\* node5 = BuyNode(5);
	BTNode\* node6 = BuyNode(6);

	node1->left = node2;
	node1->right = node4;
	node2->left = node3;
	node4->left = node5;
	node4->right = node6;
	return node1;
}

📌我们用typedef来重命名,可以很好的简化代码关键词
📌注意:上述代码并不是创建二叉树的方式,真正创建二叉树方式后序详解重点讲解
再看二叉树基本操作前,再回顾下二叉树的概念💍,二叉树是

  • 空树
  • 非空:根节点,根节点的左子树、根节点的右子树组成的。

从概念中可以看出,二叉树定义是递归式♻️的,因此后序基本操作中基本都是按照该概念实现的✨

🎄2. 四大遍历方法

二叉树的遍历有:前序/中序/后序的递归结构遍历:

  • 1️⃣前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
  • 2️⃣ 中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)
  • 3️⃣ 后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后

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

除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。

  • 4️⃣层序遍历:设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。

🤏简单来说:
在这里插入图片描述

在这里插入图片描述

🎄3. 前序遍历

先序遍历结果为:A B D H I E J C F K G

1️⃣ 动画演示:👇🏻

请添加图片描述

  • 我们可以理解为一个小人从一棵二叉树根节点为起点,沿着二叉树外沿,逆时针走一圈回到根节点,路上遇到的元素顺序,就是先序遍历的结果

2️⃣遍历规律💫:👇🏻

在这里插入图片描述

3️⃣代码实现💡:

void PreOrder(BTNode\* root)
{
	if (root == NULL)// 递归中遇到NULL,返回上一层节点
	{
		printf("# ");
		return;
	}
	printf("%d ", root->data);
	PreOrder(root->left);// 递归遍历左子树
	PreOrder(root->right);//递归遍历右子树
}

➡️采用了分治算法

  • 问题变成问题,分成类似规模的子问题(大部分的分治都用递归进行)
  • 举个例子:比如校长🥸要排查我们学院返校的名单,校长吩咐院长,院长吩咐辅导员…
  • 校长——院长——辅导员——班长——学生们

❗递归展开图(以下图为例):

在这里插入图片描述

🌍此处的递归结果:1 2 3 # # # 4 5 # # 6 # #

在这里插入图片描述
在这里插入图片描述

同学们不懂的地方一定要画图去理解!!

🎄3. 中序遍历

中遍历结果为:H D I B E J A F K C G

1️⃣ 动画演示:👇🏻

请添加图片描述

2️⃣代码实现💡:

void InOrder(BTNode\* root)
{
	if (root == NULL)// 递归中遇到NULL,返回上一层节点
	{
		printf("# ");
		return;
	}
	InOrder(root->left);// 递归遍历左子树
	printf("%d ", root->data);
	InOrder(root->right);// 递归遍历右子树
}

❗递归展开图(以下图为例):
画图很重要,不理解就要去画图✅

在这里插入图片描述

还是刚刚的递归图,只是改变了访问顺序中序:左子树——根——右子树

🌍此处的递归结果:# 3 # 2 # 1 # 5 # 4 # 6 #

在这里插入图片描述

🎄4. 后序遍历

1️⃣ 动画演示:👇🏻

请添加图片描述

2️⃣代码实现💡:

void PostOrder(BTNode\* root)
{
	if (root == NULL)// 递归中遇到NULL,返回上一层节点
	{
		printf("# ");
		return;
	}
	PostOrder(root->left);// 递归遍历左子树
	PostOrder(root->right);// 递归遍历右子树
	printf("%d ", root->data);
}

❗递归展开图(还是以下图为例):

在这里插入图片描述

还是要去画递归展开图,只是改变了访问顺序后序:左子树——右子树——根

🌍此处的递归结果:# # 3 # 2 # # 5 # # 6 4 1

在这里插入图片描述

ps:递归展开图多画就能理解,才方便后序更难的二叉树。

🎄5. 层序遍历

1️⃣ 演示:👇🏻

在这里插入图片描述

2️⃣🎇思路讲解:

请添加图片描述

  • 借助一个队列实现:先进先出
  • 上一层带下一层,先进去的先出,每次循环出一个

3️⃣代码实现💡:

void LevelOrder(BTNode\* root)
{
	Quene q;
	QueneInit(&q);
	if (root)
	{
		QuenePush(&q, root);
	}
	while (!QueneEmpty(&q))
	{
		BTNode\* front = QueneFront(&q);
		printf("%d ", front->data);
		QuenePop(&q);
		if (front->left)
		{
			QuenePush(&q, front->left);
		}
		if (front->right)
		{
			QuenePush(&q, front->right);
		}
	}
	printf("\n");
	QueneDestroy(&q);
}

在这里插入图片描述
完全一样

🐾探究二叉树节点个数以及高度

🎄1.二叉树节点个数

定义一个Count,计算结点的个数,那么Count是全局变量还是局部变量?

答案:全局变量!不然每次递归各自加各自的Count,无意义。

💡代码实现遍历法

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

🐾探究二叉树节点个数以及高度

🎄1.二叉树节点个数

定义一个Count,计算结点的个数,那么Count是全局变量还是局部变量?

答案:全局变量!不然每次递归各自加各自的Count,无意义。

💡代码实现遍历法

[外链图片转存中…(img-zJH3G5Ye-1715805144536)]
[外链图片转存中…(img-wZ68D9zi-1715805144536)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值