16 - 12 - 11 平衡二叉树 ( AVL树 )
来源:互联网 发布:天地知我心二作品顺序 编辑:程序博客网 时间:2024/04/28 16:45
平衡二叉树:
首先是一棵二叉排序树。左右子树的高度差最多等于1.而且每一个根节点的左右子树也都是二叉平衡树。
左子树深度 - 右子树深度 叫做平衡因子 ( BF: balance factor )
BF = -1,0,或1。
其查找/插入/删除的 时间复杂度都是 O(logn),是非常好的~
/*对于一端插入代码来说,我们只需要构建:*/int i;int a[10] = {3,2,1,4,5,6,7,10,9,8};BiTree T = NULL;int taller;for(i = 0 ; i < 10 ; i++){ InsertAVL(&T , a[i] , &taller )}
详见:
http://blog.csdn.net/sodaoo/article/details/53581952
我们要在插入构建时,每次插入一个节点后,都检查一下是否插入的这个节点破坏了某一个根结点的平衡性 (BF越界),
如何将一棵不平衡的二叉树变成平衡二叉树,平衡二叉树的失衡调整主要是通过旋转最小不平衡子树来实现的 。
最小不平衡子树:在新插入的结点向上查找,以第一个平衡因子的绝对值超过1的结点为根的子树称为最小不平衡子树。也就是说,一棵失衡的树,是有可能有多棵子树同时失衡的,而这个时候,我们只要调整最小的不平衡子树,就能够将不平衡的树调整为平衡的树。
简单的经过左右旋可以平衡,但是下图左旋后并没有平衡。。下面会有讲解~
↑ 对不平衡的树进行旋转的时候,不仅需要考虑需要最小失衡子树的根结点的平衡因子,还要考虑根结点较高子树的根结点的平衡因子。如图11中,较高子树为右子树,右子树不同,旋转后有着完全不同的结果。
为了方便讨论,我们使用连续的两个字母来表示平衡因子,以表示各种不同的情况。第一个字母表示最小不平衡子树根结点的平衡因子,第二个字母表示最小不平衡子树较高子树的根结点的平衡因子。使用L表示左子树较高,R表示右子树较高,E表示左右子树等高。如上述图11,根为的平衡因子L,较高子树的根为L,我们将这种情况表示为LL型,再如上述例子3,根为R,较高子树的根为L我们将这种情况称为RL型。
↓ 图片顺序从左往右看。结点加入的顺序是:
————————————{3,2,1,4,5,6,7,10,9,8}
鸣谢:
htp://www.tuicool.com/articles/IJ7vYv
- 16 - 12 - 11 平衡二叉树 ( AVL树 )
- AVL 平衡二叉树
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- AVL 平衡二叉树
- avl平衡二叉树
- 二叉平衡树AVL
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 平衡二叉树 AVL
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 二叉平衡树AVL
- AVL平衡二叉树
- 平衡二叉树(AVL)
- 景点导游系统
- 面试算法--KMP字符串查询算法
- 数组指针
- jQuery之滚动条触发
- PAT(basic level) 1046 划拳(15)
- 16 - 12 - 11 平衡二叉树 ( AVL树 )
- 支持向量机学习
- React Native布局实践:开发京东客户端首页遇到的坑
- 一个免锁环形缓冲区的实现
- 哈尔滨理工oj2323Emirp
- PAT(basic level) 1047 编程团体赛(20)
- Qt之主窗口(二)
- nat123&树莓派实现外网访问(二)
- SpringAOP详解(转载)