C++ 各类树的算法

树的内容比较多,我一步步积累到这篇文章中

数据结构

最基本的二叉树,结构体中分别有基本的左孩子节点,有孩子节点,val数据值等基本内容

二叉搜索树:左孩子要比父节点小,右孩子要比父节点大。由于树构建完成后是有序的,所以插入,删除,查找都会有很大的优势。

举一个二叉搜索树的例子:当我们实现排名的数据结构的时候,我们发现,对于任意一个根节点,左子树的排名都比自己小,右子树的排名都比自己大。也就是说,比如1~10000人的排名,数据为10000个人的分数。如果想要查找我们的位置,显然很容易。除此之外,我们可以利用它计算排名。当我们进入右子树的时候,左边的分数都是比自己小的,不考虑,当我们进入左子树的时候,右子树的分数都比自己大,count右子树的节点,将会获得排名在自己后面的人数。

字典树:(字符串树)常用于存储字符串,查询效率比哈希树高。它的特点是不同的单词之间可以共享字符串。比如add和am共享a。这样如果把一个单词存储为从根节点的子节点到叶节点,节点数量会大大减少。根节点的子节点一共才26个。在这里插入图片描述

平衡二叉树
平衡二叉树又称为AVL树,是一种特殊的二叉排序树。其左右子树都是平衡二叉树,且左右子树高度之差的绝对值不超过1。一句话表述为:以树中所有结点为根的树的左右子树高度之差的绝对值不超过1。将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF,那么平衡二叉树上的所有结点的平衡因子只可能是-1、0和1。只要二叉树上有一个结点的平衡因子的绝对值大于1,则该二叉树就是不平衡的。

但是虽然平衡二叉树平衡度高,但是当插入或删除的时候,会由多次旋转才可以得到,改变结构。

红黑树😗*(查找效率:O(log n))**红黑树是在二叉搜索树的基础上,为节点添加颜色,并且令根节点和叶节点必须是黑色,其余点可以是黑色或者是红色。并加入两个限制。红色的点不能相邻,也就是不互相为父子节点。另一个就是任何一个节点到它所有的叶节点,黑节点数量必须相同。这就限制了最长路径不能多于最短路径的两倍。对于搜索、插入、删除有优势。

哈夫曼树:哈夫曼树是对0、1数据存储压缩的最优方式,比如我们将储存的数据的使用频率作为权值,那么权值小的在哈夫曼树中往往深度比较大,表示所占的存储大,权值大的相反。我们用无重复前缀的0、1字符串就可以结合权值构建出哈夫曼树。

B树:定义一个B树为m阶,那么根节点最少有两个子节点,每个节点最少有m/2个子节点,最多m+1个。每个节点存储数据,叶节点在同一层存储空指针。插入删除是自下而上的。

B+树:B+树常常用于磁盘,SQL查询存储等等,因为其对于查找,删除,插入具有稳定的复杂度,因为所有存储数据的节点都是叶节点,其他节点只是存储了key值。

B+树适合存储索引的原因:https://blog.csdn.net/weixin_30531261/article/details/79312676

数据结构的实现

二叉树的节点实现,和链表的实现节点很像。

struct TreeNode {
   
 	   int val;
       TreeNode *left;
       TreeNode *right;
       TreeNode() : val(0), left(nullptr), right(nullptr) {
   }
       TreeNode(int x) : val(x), left(nullptr), right(nullptr) {
   }
       TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {
   }

字典树的实现,相当于一个26叉树,每一个子节点对应一个英文字母,并取isWord标识来确定是否存储过该单词,比如我们存储了“apple”,来区分我们存储过"app"

class Trie{
   
public:
    Trie* next[26]={
   nullptr};
    bool isWord;
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值