数据结构-复习(三):平衡二叉树 AVL

2.9 平衡二叉树

原因:由于二叉搜索树的时间复杂度受输入顺序的影响,在最好的情况下复杂度为O(log n),最坏的情况下复杂度为O(n);为了使二叉搜索树的时间复杂度始终保持在O(log n)级的平衡状态,Adelson-Velskii和Landis发明了AVL树(平衡二叉树)。

定义

定义:结点的平衡因子:二叉树中某结点的右子树的高度和左子树的高度之差称为该节点的平衡因子。

平衡二叉树:是一个空树,或者是具有以下性质的二叉搜索树:

  1. 树中的任意一个节点的平衡因子的绝对值不超过1;
  2. 任一结点的左子树和右子树都是平衡二叉树。

基本操作:

  • 查找:和二叉搜索树算法一致。
  • 插入:为了使插入节点后的二叉树仍然保持平衡二叉树的性质,就需要在插入结点后判断插入行为是否破坏了平衡性,如果破坏了平衡性,则要调整树的结构使其平衡化。

平衡化的调整方式:在插入一个新节点后,需要从插入位置沿通向根的路径回溯,检查各个节点的平衡因子。如果在某一节点处发现不平衡,停止回溯。从发生不平衡的结点起,沿刚才回溯的路径取直接下两层的结点。

  1. 如果这三个节点处于一条直线上则采用单旋转进行平衡化。按旋转方向分为左单旋转(2)和右单旋转(-2)。
  2. 如果这三个节点处于一条折线上,则采取双旋转进行平衡化。双旋分为左右旋转(-2)和右左旋转(2)。

 

  • 删除:删除节点的步骤如下:
  1. 用一般的二叉搜索树的删除算法找到并删除节点x;
  2. 沿根节点到被删除节点的路径的逆向逐层向上回溯,并重新计算x的祖先结点的平衡因子,必要时修改x祖先的平衡因子。
  3. 回溯途中如果发现某个祖先失去了平衡性,就要进行调整使之平衡。
  4. 如果平衡调整以后,子树的高度比调整前降低了,需要继续回溯,即继续沿着通过根的路径上考查其父节点的平衡因子,重复上面的过程。在平衡二叉树上删除一个节点,可能引起多次平衡化调整。
  5. 如果平衡化调整后子树的高度不变,则停止回溯。

AVL树的效率:

AVL树的检索、插入、删除的效率都是O(log n).

二叉搜索树(包括AVL树)适用于组织内存中小规模的目录。对于较大的、存放在外存储器上的文件,用二叉搜索树来组织索引就不太合适。在文件索引中大量使用的是每个节点包含多个关键码的B树,尤其是B+树。

2.10 堆和优先队列

2.11 huffman编码树

huffman树又称最优二叉树,是一类加权路径长度最短的二叉树,在编码设计、决策与算法设计等领域中有着广泛的应用。

  • 建立huffman

给出n个实数W0,W1,...,Wn(n>=2),要求得到一个具有那个外部节点的扩充二叉树,该扩充二叉树的每个外部节点k_i有一个W_i与之对应,作为节点k_i的权值,使得带权路径外部长度WPL=\sum_{i=0}^{n-1} W_il_i为最小,l_i是从根到外部节点k_i的路径长度。

  • 构建方法:
  1. 根据给定的n个权值构成n棵二叉树的集合F,其中每棵二叉树中只有一个权值为Wi的根节点。
  2. 在集合F中选取两颗根权值最小的树作为左、右子树来构建一个新的二叉树,且设置新二叉树的根节点的权值为其左、右子树根节点的权值之和。
  3. 在F集合中删除这两颗树,同时将新得到的二叉树加入集合F中。
  4. 重复2和3,直到F集合中只含一棵树为止。
  • 注意:
  1. 满二叉树不一定是哈夫曼树 。
  2. 哈夫曼树中权越大的叶子离根越近  (很好理解,WPL最小的二叉树)。
  3. 具有相同带权结点的哈夫曼树不惟一。
  4. 哈夫曼树的结点的度数为 0 或 2, 没有度为 1 的结点。
  5. 包含 n 个叶子结点的哈夫曼树中共有 2n – 1 个结点。
  6. 包含 n 棵树的森林要经过 n–1 次合并才能形成哈夫曼树,共产生 n–1 个新结点

树和森林

二叉树、树、森林之间的转换:

将一颗树转换为二叉树的方法:

  1. 树中所有相邻兄弟节点之间加一条连线。
  2. 对于树中的每个节点,只保留它与第一个孩子的连线,删去它与其他孩子节点之间的连线。
  3. 以树的根节点为轴心,将整棵树顺时针转动一定角度,使之结构层次分明。

将一个森林转化为二叉树:

  1. 将森林中的每棵树都转化为二叉树。
  2. 第一棵二叉树不动,从第二棵开始,依次把后一棵的根节点作为前一棵二叉树根节点的右孩子。

树的存储:

  1. 孩子表示法:定长结点的多重链表(data,child1,child2,...)或者不定长节点的多重链表(data,degree,child1,...)。
  2. 孩子-兄弟表示法:(data,firstchild,nextSibling)
  3. 双亲表示法:用一组连续的存储单元存储树的节点。(data,parent):data中存放该节点数据,parent中表示该节点的双亲位置。

树的应用:

  1. 二叉树:图像压缩算法
  2. 树:医院设施管理

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值