网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
文章目录
🚀前言
二叉树可以根据特定的属性进行分类,以下是常见的二叉树分类:
- 满二叉树(Full Binary Tree):除了叶子节点,每个节点都有两个子节点。
- 完全二叉树(Complete Binary Tree):除了最后一层外,其它层的节点都是满的,最后一层的节点都靠左对齐。
- 二叉搜索树(Binary Search Tree,BST):对于每个节点,左子树上的所有节点的值都小于等于该节点的值,右子树上的所有节点的值都大于等于该节点的值。
- 平衡二叉树(Balanced Binary Tree):对于任意节点,它的左子树和右子树的高度差不大于1。
- 线索二叉树(Threaded Binary Tree):在二叉树节点中设置了指向前驱节点和后继节点的线索,可以方便地进行遍历。
- 哈夫曼树(Huffman Tree):用于数据压缩,根据数据出现的频率构建的二叉树,频率越高的节点离根节点越近。
- Trie树(前缀树):用于字符串的存储和搜索,每个节点代表一个字符串的字符,从根节点到叶子节点的路径表示一个完整的字符串。
- B树(B-Tree):一种平衡多路查找树,用于大规模数据的存储和检索,每个节点可以有多个子节点。
🚀一、二叉树的分类
🔎1.线索二叉树
线索二叉树是对二叉树进行加工,使其能够快速遍历所有节点。
在线索二叉树中,除了左右孩子指针,还添加了两个额外的指针:前驱指针和后继指针。这两个指针分别指向当前节点的前驱节点和后继节点。
对于一个二叉树来说,存在多种线索化方式。以下是两种常见的线索化方式:
- 前序线索二叉树:在前序遍历过程中进行线索化。对于每个节点,先处理其前驱指针,然后处理左子树,再处理右子树,最后处理后继指针。对于树中的第一个节点,其前驱指针为空,对于树中的最后一个节点,其后继指针为空。
- 中序线索二叉树:在中序遍历过程中进行线索化。对于每个节点,先处理其左子树,然后处理前驱指针,然后处理右子树,最后处理后继指针。对于树中的第一个节点,其前驱指针为空,对于树中的最后一个节点,其后继指针为空。
在线索二叉树中,通过前驱和后继指针,可以快速地找到节点的前驱节点和后继节点,从而实现快速遍历。
🦋1.1 案例
假设有以下二叉树:
1
/ \
2 3
/ \ / \
4 5 6 7
对这棵二叉树进行中序线索化,得到的线索二叉树如下所示:
4 - 2 - 5 - 1 - 6 - 3 - 7
在线索二叉树中,每个节点的左右孩子指针被替换为前驱和后继指针。
在这个例子中,节点1的左前驱指针指向节点5,右后继指针指向节点6;节点2的左前驱指针指向节点4,右后继指针指向节点1;节点3的左前驱指针指向节点6,右后继指针指向节点7;节点4的左前驱指针指向节点2,右后继指针指向节点5;节点5的左前驱指针指向节点4,右后继指针指向节点1;节点6的左前驱指针指向节点1,右后继指针指向节点3;节点7的左前驱指针指向节点3,右后继指针为空。
通过线索化后的二叉树,可以快速地找到每个节点的前驱和后继节点,从而实现快速的中序遍历。
🔎2.最优二叉树
最优二叉树,也称为哈夫曼树,是一种特殊的二叉树结构,常用于编码和解码的应用中。
最优二叉树的特点是,频率高的节点离根节点较近,频率低的节点离根节点较远。通过这种方式,可以实现最小化编码的平均长度,从而达到最优的压缩效果。
构建最优二叉树的基本思路是,首先根据每个节点的权重(即出现频率)进行排序,然后选择权重最小的两个节点作为左右子节点,生成一个新的父节点,并将父节点的权重设置为左右子节点的权重之和。重复这个过程,直到所有节点构建成一棵树。
最优二叉树可以应用在哈夫曼编码中,通过树的路径来表示字符的编码,使得频率高的字符编码较短,频率低的字符编码较长,从而实现压缩数据的效果。
相关概念如下:
- 路径:树中一个结点到另一个结点之间的通路。
- 结点的路径长度:路径上的分支数目。
- 树的路径长度:根节点到达每一个叶子节点之间的路径长度之和。
- 权:节点代表的值。
- 结点的带权路径长度:该结点到根结点之间的路径长度乘以该节点的权值。
- 树的带权路径长度(树的代价):树的所有叶子节点的带权路径长度之和。
哈夫曼树的求法:给出一组权值,将其中两个最小的权值作为叶子节点,其和作为父节点,组成二叉树,而后删除这两个叶子节点权值,并将父节点的值添加到该组权值中。重复进行上述步骤,直至所有权值都被使用完。
构造出的哈夫曼树中,所有初始给出的权值都作为了叶子节点,此时,求出每个叶子节点的带权路径长度,而后相加,就是树的带权路径长度,这个长度是最小的。
🦋2.1 案例
假设有以下节点集合:
节点A,出现的频率为5
节点B,出现的频率为3
节点C,出现的频率为2
节点D,出现的频率为1
为了构建最优二叉树,我们可以按照以下步骤进行:
- 将节点集合按照频率从小到大进行排序,得到排序后的节点集合:D,C,B,A。
- 从集合中选择频率最小的两个节点作为叶子节点,并创建一个新的节点作为它们的父节点,父节点的频率为子节点的频率之和。在我们的例子中,D和C被选择为叶子节点,它们的频率之和为3。
- 将新的父节点加入到集合中,并将集合重新排序。新的节点集合为:B,A,新的父节点。
- 重复步骤2和步骤3,直到集合中只剩下一个节点。
- 最后剩下的节点就是构建的最优二叉树的根节点。
根据上述步骤,我们可以得到如下的最优二叉树:
B
/ \
C A
/
D
还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!
王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。
对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!
【完整版领取方式在文末!!】
***93道网络安全面试题***
![](https://img-blog.csdnimg.cn/img_convert/6679c89ccd849f9504c48bb02882ef8d.png)
![](https://img-blog.csdnimg.cn/img_convert/07ce1a919614bde78921fb2f8ddf0c2f.png)
![](https://img-blog.csdnimg.cn/img_convert/44238619c3ba2d672b5b8dc4a529b01d.png)
内容实在太多,不一一截图了
### 黑客学习资源推荐
最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
#### 1️⃣零基础入门
##### ① 学习路线
对于从来没有接触过网络安全的同学,我们帮你准备了详细的**学习成长路线图**。可以说是**最科学最系统的学习路线**,大家跟着这个大的方向学习准没问题。
![image](https://img-blog.csdnimg.cn/img_convert/acb3c4714e29498573a58a3c79c775da.gif#pic_center)
##### ② 路线对应学习视频
同时每个成长路线对应的板块都有配套的视频提供:
![image-20231025112050764](https://img-blog.csdnimg.cn/874ad4fd3dbe4f6bb3bff17885655014.png#pic_center)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**