树和二叉树的应用


二叉排序树(BST)定义与特性
定义:二叉排序树是一种特殊的二叉树,其中每个结点的值都大于其左子树上所有结点的值,并且小于其右子树上所有结点的值。
特性:
若左子树非空,左子树上所有结点的值都小于根结点的值。
若右子树非空,右子树上所有结点的值都大于根结点的值。
左子树和右子树本身也是二叉排序树。
二叉排序树的查找
查找操作从根结点开始,逐层向下比较:
若给定值与根结点的值相等,则查找成功。
若给定值小于根结点的值,则在左子树中继续查找。
若给定值大于根结点的值,则在右子树中继续查找。
查找过程是递归进行的。
二叉排序树的插入
插入新结点的过程遵循以下步骤:
如果原二叉排序树为空,则直接插入新结点作为根结点。
如果要插入的关键字小于根结点的值,则将其插入到左子树。
如果要插入的关键字大于根结点的值,则将其插入到右子树。
新插入的结点总是一个新添加的叶结点,并且是查找失败时访问的最后一个结点的左孩子或右孩子。
二叉排序树的构造
以查找关键字序列  {45, 24, 53, 45, 12, 24}  为例,构造二叉排序树的过程是按照上述插入规则逐步进行的。
二叉排序树的删除
删除结点的规则如下:
如果被删除的结点是叶结点,直接删除即可。
如果结点只有一棵左子树或右子树,将该子树提升到父结点的位置,替代被删除结点。
如果结点有两棵子树,可以选择其直接后继或直接前驱来替代该结点,然后删除这个后继或前驱,这样就转换成了前两种情况。
查找效率
二叉排序树的查找效率主要取决于树的高度:
如果二叉排序树是平衡的,平均查找时间复杂度为 O(\log n)。
如果二叉排序树退化为只有左(或右)子树的单支树,平均查找时间复杂度退化为 O(n)。
 


平衡二叉树是个啥?
想象一下你手里有一堆书,你想要把它们堆得整整齐齐,每一层都比上一层多一本书,这样堆起来既好看,又稳定。平衡二叉树也是这个意思,它要求树里的每个节点,左边和右边的“书堆”高度差不能超过1,这样树就保持了平衡。
平衡因子是啥?
就像你数数每层书堆有几本书一样,平衡因子就是比较一个节点左边和右边子树的高度差。如果差值是-1、0或1,那这个节点就是平衡的;如果超过这个范围,就需要调整一下。
怎么插入新节点?
当你往书堆里加新书时,你得小心翼翼地放,以免书堆倒了。在平衡二叉树里插入新节点也是这个道理:
找到合适的位置把新节点加进去。
然后一路检查回去,看看有没有因为新节点的加入导致哪一层的书堆不平衡了。
如果发现了,就得动手调整,让树重新变得平衡。
平衡旋转是咋回事?
如果书堆不平衡了,你得调整一下,可能是把上面的书挪到下面,或者把左边的书挪到右边。平衡二叉树也是这样,有四种调整方法:
LL旋转:就像是你把左边的书堆往右挪一下。
RR旋转:就像是你把右边的书堆往左挪一下。
LR旋转:先左边的书堆往右挪,然后再把这部分往左上方挪。
RL旋转:先右边的书堆往左挪,然后再把这部分往右上方挪。
查找操作呢?
找书的时候,如果书堆是平衡的,你很快就能找到你想要的那本书。平衡二叉树的查找操作也是类似的,因为树保持了平衡,所以查找起来效率很高,就像你在整齐的书堆里找书一样。

哈夫曼树
想象一下,你有一堆带标签的树叶,每个标签上写着一个数字,代表这个树叶出现的次数。哈夫曼树就像是一个特殊的树,它帮你把这堆树叶组织起来,让你从树根走到任何一个树叶的路径总和(也就是数字乘以步数)尽可能的小。这样,如果你要存储或者发送这些树叶的信息,就能节省空间或者时间。
怎么造一棵哈夫曼树?
把出现次数最少的两个树叶找出来。
把这两个树叶合并成一个新树叶,标签上的数字是原来两个树叶数字的和。
重复这个过程,直到所有的树叶都合并到一棵树上。
哈夫曼编码
现在,我们用这棵树来给每个树叶编码。编码的规则是,往左走就是0,往右走就是1。这样,每个树叶从树根到自己的路径,就变成了一串0和1的组合,这就是它的编码。
为什么哈夫曼编码牛?
因为树叶出现的次数不一样多,所以用哈夫曼编码可以把出现次数多的树叶编码得短一些,出现次数少的编码得长一些。这样一来,整体上,我们发送或者存储的信息就会更少,因为短编码比长编码多嘛。
总结一下
哈夫曼编码就是用一种聪明的方法来给信息编码,让常用的信息用更少的存储空间或者传输时间,不常用的信息多占一点也没关系。这样,整体上既节省了空间,又提高了效率。
 

知识点链接
二叉排序树(BST)定义与特性
定义:二叉排序树是一种特殊的二叉树,其中每个结点的值都大于其左子树上所有结点的值,并且小于其右子树上所有结点的值。
特性:
若左子树非空,左子树上所有结点的值都小于根结点的值。
若右子树非空,右子树上所有结点的值都大于根结点的值。
左子树和右子树本身也是二叉排序树。
二叉排序树的查找
查找操作从根结点开始,逐层向下比较:
若给定值与根结点的值相等,则查找成功。
若给定值小于根结点的值,则在左子树中继续查找。
若给定值大于根结点的值,则在右子树中继续查找。
查找过程是递归进行的。
二叉排序树的插入
插入新结点的过程遵循以下步骤:
如果原二叉排序树为空,则直接插入新结点作为根结点。
如果要插入的关键字小于根结点的值,则将其插入到左子树。
如果要插入的关键字大于根结点的值,则将其插入到右子树。
新插入的结点总是一个新添加的叶结点,并且是查找失败时访问的最后一个结点的左孩子或右孩子。
二叉排序树的构造
以查找关键字序列  {45, 24, 53, 45, 12, 24}  为例,构造二叉排序树的过程是按照上述插入规则逐步进行的。
二叉排序树的删除
删除结点的规则如下:
如果被删除的结点是叶结点,直接删除即可。
如果结点只有一棵左子树或右子树,将该子树提升到父结点的位置,替代被删除结点。
如果结点有两棵子树,可以选择其直接后继或直接前驱来替代该结点,然后删除这个后继或前驱,这样就转换成了前两种情况。
查找效率
二叉排序树的查找效率主要取决于树的高度:
如果二叉排序树是平衡的,平均查找时间复杂度为 O(\log n)。
如果二叉排序树退化为只有左(或右)子树的单支树,平均查找时间复杂度退化为 O(n)。

平衡二叉树的定义
平衡二叉树是一种特殊的二叉树,它在进行插入和删除操作后,能够自动调整树的结构以保持平衡。这种平衡是指,对于树中的任意一个节点,其左子树和右子树的高度差(称为平衡因子)的绝对值不超过1。这样的设计可以保证二叉树的查找、插入和删除操作都能在对数时间内完成。
平衡因子
平衡因子是一个节点的左子树高度与右子树高度的差值。它的值只能是-1、0或1。如果平衡因子的绝对值大于1,说明树失去了平衡。
平衡二叉树的插入
在平衡二叉树中插入节点时,需要按照以下步骤进行:
像在普通的二叉排序树中一样插入节点。
检查从根到新节点的路径上的所有节点,看是否有节点的平衡因子因为这次插入而变得不平衡(绝对值大于1)。
如果找到不平衡的节点,需要进行相应的旋转操作来恢复平衡。
平衡旋转
有四种基本的旋转操作,分别是:
LL平衡旋转(右单旋转):当一个节点的左孩子的左子树上插入新节点,导致该节点的平衡因子从1增至2,需要进行一次向右的旋转操作。
RR平衡旋转(左单旋转):当一个节点的右孩子的右子树上插入新节点,导致该节点的平衡因子从-1减至-2,需要进行一次向左的旋转操作。
LR平衡旋转(先左后右双旋转):当一个节点的左孩子的右子树上插入新节点,导致该节点的平衡因子从1增至2,需要进行两次旋转操作,先左旋转后右旋转。
RL平衡旋转(先右后左双旋转):当一个节点的右孩子的左子树上插入新节点,导致该节点的平衡因子从-1减至-2,需要进行两次旋转操作,先右旋转后左旋转。
平衡二叉树的查找
平衡二叉树的查找操作与普通二叉排序树相同,但由于树的高度被限制在对数级别,因此查找的平均时间复杂度是O(log n),其中n是树中节点的数量。

哈夫曼树(Huffman Tree)
基本概念:哈夫曼树是一种特殊的二叉树,它通过最小化所有叶结点的带权路径长度来优化数据存储或传输。这里的“权”通常是指数据元素出现的频率。
带权路径长度:从树的根到任意结点的路径长度(经过的边数)与该结点上权值的乘积。
定义:哈夫曼树是在含有n个带权叶结点的二叉树中,带权路径长度(WPL)最小的二叉树。
哈夫曼树的构造
从合成后存在的结点中选出两个权值最小的结点。
将这两个结点合并为一个新结点,新结点的权值是这两个结点权值的和。
重复上述步骤,直到所有结点都在一个树内。
哈夫曼编码(Huffman Coding)
基本概念:哈夫曼编码是一种可变长度的编码方式,它根据字符出现的频率来分配编码,频率高的字符使用较短的编码,频率低的字符使用较长的编码,以此来减少数据的平均编码长度,实现数据压缩。
固定长度编码:每个字符用固定长度的二进制位表示。
可变长度编码:根据字符出现的频率分配不同长度的编码。
前缀编码:编码之间没有公共前缀,即没有任何一个编码是另一个编码的前缀。
构造哈夫曼编码的步骤
将每个出现的字符视为独立的结点,其权值为字符出现的频度。
构造出对应的哈夫曼树。
将字符的编码解释为从根至该字符的路径上边标记的序列。边标记为0表示“转向左孩子”,标记为1表示“转向右孩子”。
Tips
哈夫曼编码是一种被广泛应用且非常有效的数据压缩编码方法。
哈夫曼编码的效率和有效性主要得益于其能够根据数据的实际使用情况动态地调整编码长度,从而在不牺牲解码准确性的前提下,达到最优的压缩效果。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值