平衡二叉树

2024-05-04 23:11

1. 平衡二叉树

  平衡二叉树(Height-Balanced Binary Search Tree):他也是一种二叉排序树。平衡二叉树是一颗空树或者其中每个结点的左子树和右子树的高度差最多等于1的二叉排序树.这个解决平衡二叉树的算法是由两位俄罗斯数学家G.M.Adelson-Velskii和E.M.Landis在1962年共同发明的,所以平衡二叉树也简称为AVL树。 
    平衡因子: 将二叉树上结点的左子树深度减去右子树高度的值称为平衡因子BF(Balanced Factor).那么平衡二叉树上所有结点的平衡因子只能是-1,0,1.   
                                           
    平衡二叉树实现原理:在构建二叉排序树的过程中,每当插入一个节点值,先检查是否因插入而破环了树的平衡性,如果破坏了就找出最小不平衡子树。在保持二叉排序树的前提下,调整最小不平衡子树种各个结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。 
   原平衡二叉树的平衡被打破后的四种旋转方法:   假设最小不平衡子树的根节点为被破坏结点,新插入的结点叫做破坏节点   1.RR旋转(右单旋):破坏结点在被破坏节点的右子树的右边,因而叫做RR插入。
                                                                                   2.LL旋转(左单旋):破坏节点在被破坏节点的左子树的左边,因而叫做LL插入。
                                                                                   3.LR旋转:破坏结点在被破坏节点的左子树的右边,因而叫做LR插入。
                                           4.RL旋转:破坏节点在被破坏节点的右子树的左边,因而叫做RL插入。
                                           上述四种旋转方式是根据结点的插入位置来命名的,有点绕口。我们不妨这样理解:   当进行RR插入时,就进行左旋操作。也就是对被破坏节点进行逆时针旋转,然后根据二叉排序树的特性对一些结点进行调整。
   当进行LL插入时,就进行右旋操作。也就是对被破坏节点进行顺时针旋转,然后根据二叉排序树的特性对一些结点进行调整。
   当进行RL插入时,就进行双旋操作。也就是先对最小不平衡子树中以被破坏结点为根节点的子树中做一次右旋转操作,以便让bf值和被破坏结点的bf值符号相同。然后对整颗最小不平衡子树做一次左旋转操作。
   当进行LR插入时,就进行双旋操作。也就是先对最小不平衡子树中以被破坏结点为根节点的子树中做一次左旋转操作,以便让bf值和被破坏结点的bf值符号相同。然后对整颗最小不平衡子树做一次右旋转操作。
    假设n个结点,则一颗平衡二叉树的深度为log以2为底n的对数。因而深度的数量级为logn。所以平衡二叉树的查找,删除,插入时间复杂度都为O(logn)。 

平衡二叉树

2. 平衡二叉树

 平衡二叉树的定义:    它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,同时,平衡二叉树必定是二叉搜索树,反之则不一定.    问题1:    把一个升序的数组转换成平衡二叉树    对一个二叉搜索树进行中序遍历就可以得到一个升序的数组,那么反过来考虑,数组的中值即为root,然后数组分为左子树和右子树,继续进行递归即可得出结果.
   问题2:    给一个二叉树,判断是否是平衡树    首先写计算二叉树高度的函数   树的高度 = max(左子树高度,右子树高度)+1
   可以得到高度后对树递归求解每个节点的左右子树的高度差,如果有大于1的,则return False

3. 平衡二叉树的介绍

平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。构造与调整方法 平衡二叉树的常用算法有红黑树、AVL、Treap等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。

平衡二叉树的介绍

4. 平衡二叉树的构建

  平衡二叉搜索树是一种结构平衡的二叉搜索树,即叶节点高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。能在  内完成插入、查找和删除操作,最早被发明的平衡二叉搜索树为AVL树。
  
   节点的平衡因子是它的左子树的高度减去它的右子树的高度。带有平衡因子1、0或 -1的节点被认为是平衡的。带有平衡因子 -2或2的节点被认为是不平衡的,并需要重新平衡这个树。平衡因子可以直接存储在每个节点中,或从可能存储在节点中的子树高度计算出来。
  
   距离插入点最近的,且平衡因子的绝对值大于1的结点为根的子树,我们称为最小不平衡子树。
  
   在构建二叉排序树的过程中,每当插入一个结点时,先检查是否因为插入而破坏了树的不平衡性,若是,则找到最小不平衡子树。在保持二叉排序特性的前提下,调整最小不平衡子树各结点之间的链接关系。进行相应的旋转,使其成为新的平衡子树。
  
   若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个数据元素为e的新结点,并返回1,否则返回0。若因插入而使二叉排序树失去平衡,则作平衡旋转处理,布尔变量taller反映T长高与否。

5. 平衡树:平衡二叉树


平衡树:平衡二叉树

6. 平衡二叉树的算法

 Size Balanced Tree(简称SBT)是一自平衡二叉查找树,是在计算机科学中用到的一种数据结构。它是由中国广东中山纪念中学的陈启峰发明的。陈启峰于2006年底完成论文《Size Balanced Tree》,并在2007年的全国青少年信息学奥林匹克竞赛冬令营中发表。由于SBT的拼写很容易找到中文谐音,它常被中国的信息学竞赛选手和ACM/ICPC选手们戏称为“傻B树”、“Super BT”等。相比红黑树、AVL树等自平衡二叉查找树,SBT更易于实现。据陈启峰在论文中称,SBT是“目前为止速度最快的高级二叉搜索树”。SBT能在O(log n)的时间内完成所有二叉搜索树(BST)的相关操作,而与普通二叉搜索树相比,SBT仅仅加入了简洁的核心操作Maintain。由于SBT赖以保持平衡的是size域而不是其他“无用”的域,它可以很方便地实现动态顺序统计中的select和rank操作。

7. 平衡二叉树的具体算法

平衡二叉搜索树双称为AVL树,它也是一棵二叉搜索树,是对二叉搜索树的一种改进,或都是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。
  
  
  平衡因子(Balance Factor,BF)定义为该节点的左子树的深度减去其右子树的深度,则平衡二叉树上所有节点的平衡因子只可能是-1、0和1。只要树上有一个节点的平衡因子的绝对值大于1,则该二叉树就是不平衡的了。
  
  
  使用二叉排序树保持平衡的基本思想是:每当在二叉排序树中插入一个节点时,首先检查是否因插入而破坏了平衡,若是,则找出其中的最小不平衡二叉树,在保持二叉排序树特性的情况下,调整最小不平衡子s树中节点之间的关系,以达到新的平衡。所谓最小不平衡子树指离插入节点最近且以平衡因子的绝对值大于1的节点作为根的子树。
  
  
  对于平衡二叉搜索树,保持树的平衡的基本机制就是旋转。旋转是对树的元素顺序进行调节。旋转的目的是消除由于临时插入和删除对树的平衡产生的影响。
  
   对于平衡二叉树的遍历,搜索,等都有不同的算法,你要具体实在无法确定,都说一遍那就是一本书了,呵呵!!

平衡二叉树的具体算法

8. 平衡二叉树的具体算法

平衡二叉搜索树双称为AVL树,它也是一棵二叉搜索树,是对二叉搜索树的一种改进,或都是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。
平衡因子(Balance
Factor,BF)定义为该节点的左子树的深度减去其右子树的深度,则平衡二叉树上所有节点的平衡因子只可能是-1、0和1。只要树上有一个节点的平衡因子的绝对值大于1,则该二叉树就是不平衡的了。
使用二叉排序树保持平衡的基本思想是:每当在二叉排序树中插入一个节点时,首先检查是否因插入而破坏了平衡,若是,则找出其中的最小不平衡二叉树,在保持二叉排序树特性的情况下,调整最小不平衡子s树中节点之间的关系,以达到新的平衡。所谓最小不平衡子树指离插入节点最近且以平衡因子的绝对值大于1的节点作为根的子树。
对于平衡二叉搜索树,保持树的平衡的基本机制就是旋转。旋转是对树的元素顺序进行调节。旋转的目的是消除由于临时插入和删除对树的平衡产生的影响。
对于平衡二叉树的遍历,搜索,等都有不同的算法,你要具体实在无法确定,都说一遍那就是一本书了,呵呵!!
最新文章
热门文章
推荐阅读