完全理解二叉树(下)——平衡二叉树、二叉排序树、哈夫曼树

本文详细介绍了平衡二叉树(AVL树)的概念、存储结构、旋转操作及平衡调整策略。接着讲解了二叉排序树的定义、存储结构及其查找、插入、删除操作。最后探讨了哈夫曼树的背景、构建过程和性质,展示如何通过哈夫曼树优化数据查找效率。
摘要由CSDN通过智能技术生成

完全理解二叉树(上)——二叉树的概念、遍历、构造以及线索化
完全理解二叉树(中)——二叉树与树、森林的转化及遍历

1. 平衡二叉树

二叉树可以用于查找元素,对于如下这颗二叉树:
在这里插入图片描述
对其的遍历相当于对链表的遍历,因此找到元素5需要从头开始,查找5次,但是如果树的形状是这样:
在这里插入图片描述
从根结点出发只需要查找3次即可找到元素5。

1.1 定义

左右子树高度差不超过1的二叉树称为平衡二叉树(AVL树),注意是对于树中的任意结点。
例如:
在这里插入图片描述
在这里插入图片描述
都不是平衡二叉树。
结点的平衡因子 = 左子树高 - 右子树高,平衡因子的绝对值不超过1,如下图所示:
在这里插入图片描述

1.2 存储结构

typedef struct AVLTreeNode* avltree;
struct AVLTreeNode{
    int data;
    int balance;
    avltree lnode,rnode; 
};

1.3 左旋与右旋操作

在结点的插入过程中,无论插入的位置在哪,新结点的加入必定会影响平衡因子,可能查找路径上的所有平衡因子都会被影响,因此需要找到一种方法,在整体平衡因子改动最小的基础上,依然满足AVL树的定义。
最小失衡子树:在插入一个结点后,那么这个结点向上查找,第一个出现左右不平衡的树就是最小失衡子树,即找到平衡因子的绝对值先超过 1 的结点。

  • 左旋
    对于这样一颗树
    在这里插入图片描述
    插入结点 6 后,变成
    在这里插入图片描述
    显然,第一个被破坏的平衡因子就是结点 2,则需要对结点 2 进行左旋转。步骤为:
  1. 该结点的右孩子代替该结点的位置(结点3代替结点2成为根结点)
  2. 右孩子的左孩子变成该结点的右孩子(结点4变成结点2的右孩子)
  3. 该节点变成右孩子结点的左孩子(结点2变成结点3的左孩子)
    得到的新平衡二叉树为
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值