数据结构与算法学习总结9

平衡二叉树(AVL树):

    前提是有序的二叉树,它的左右子树的高度差不超过1,而且它的所有子树也满足这个条件

    如果一个有序二叉树呈现接近单支状(类似链表),它的查找效率接近链表,因此只有达到平衡时它的查找效率最高

    由于节点的值受限,因此只能通过调整达到有序,而不能进行值的修改

    二叉树不平衡的基础原因:

            x                                              y

         /      \                                        /     \

       y        t1   以y为轴向右旋转    z         x

    /     \                                         /   \      /   \

  z       t2                                    t3   t4   t2   t1

 /    \

t3      t4

        x                                                  y

      /    \                                             /     \

    t1    y        以y为轴向左旋转      x        z

          /   \                                     /   \     /    \

      t2       z                                t1   t2  t3    t4

              /    \

          t3        t4

        x               x                 z

       / \             / \                /   \

     y   t1        z   t1            y     x

     / \            / \               /  \     /  \

   t2  z        y   t4          t2  t3  t4   t1

       / \       /   \

    t3   t4   t2  t3

    以z为轴向左旋转   以z为轴向右旋转    最终平衡

        x                 x                  z

       / \                / \               /     \

    t1   y            t1  z           x        y  

         / \                 / \        /  \      /   \

      z     t2           t3  y    t1  t3   t4    t2

     /   \                /   \

   t3   t4           t4      t2

    以z为轴右旋       以z为轴左旋           最终平衡

红黑树:

    也是一种自平衡的树,它不是根据子树的高度差来调整平衡的,而是给节点设置一种颜色,来达到平衡

    红黑树的特性:

    1、每个节点或者是黑色、或者是红色

    2、根节点必须是黑色

    3、每个叶子节点(NULL)是黑色

    4、如何一个节点是红色,则它的子节点必须是黑色

        不能有两个连续的红色节点

    5、从一个节点到该节点的子孙节点的所有路径上包含了相同数量的黑色节点

        保证大致上红黑树是平衡的(最长路径不超过最短路径的两倍)

   

    红黑树插入后的调整:

        插入的节点一定是红色

            1、如果父节点是黑色,直接插入

            2、如果父节点是红色,需要调整

                a、叔叔不存在 or 叔叔为黑色

                    进行 左旋 or 右旋

                    祖父节点置红 父节点置黑

                b、叔叔存在且为红色

                    祖父置红,父节点和叔叔置黑

                    把祖父节点当做当前节点,继续向上讨论调整

    优点:插入、删除的效率比AVL树高

    缺点:没有AVL树平均,查找效率没有AVL树高,但也并不差

哈夫曼树:

    基本概念:

    路径长度:从一个节点到另一个节点之间的路径条目数

            根节点到第n层节点的路径长度为 n-1

    树的路径长度:从根节点出发到每个节点的路径长度之和

    节点的权:若将树中节点赋予一个有某种意义的数值,该数值称为该节点的权

    节点的带权路径长度:从根节点到该节点的路径长度与该节点的权的乘积

    树的带权路径长度:所有的叶子节点的带权路径长度之和,称为WPL

        WPL是衡量一棵带权二叉树优劣的关键

   

    例子:

    成绩:  <60     60~69   70~79   80~89   90~100

    等级:  E         D       C       B       A

    比例:  5%       15%     40%     30%     10%

    普通带权二叉树的WPL:5*1+15*2+40*3+30*4+10*4=315

    哈夫曼树的WPL:40+2*30+3*15+4*10+4*5 = 205

    哈夫曼树的目的是为了生成一棵WPL最小的的带权二叉树

    构建哈夫曼树:

        1、把n个带权节点存入一个集合F中,把每个节点左右子树置空

        2、从F中选取权值最小的两个节点作为左右子树构建成一棵新的二叉树,且新的根节点的权为左右子树的权值之和

        3、从F中删除刚刚选出来的两个节点,把新得到的根节点放入F中

        4、重复2、3步骤,直到F中只剩下一棵树,既是哈夫曼树

   



















 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值