[置顶] 【数据结构】平衡二叉树的构建以及增加删除操作
2016-12-19 22:15
543 查看
一、前言
最近学习中遇到了平衡二叉树的实用,要求是对一个数据列,进行平衡二叉树的排列,并画出结果,小编刚开始的时候不是很会,通过总结资料学习了一下平衡二叉树的相关知识,通过博客总结一下。二、什么是平衡二叉树?
平衡二叉树(Balanced Binary Tree),又称为AVL树。它具有如下的性质:①它的左右子树都是平衡二叉树 ②而且左子树和右子树的深度之差的绝对值不超过1
平衡因子(BF Balance Factor):该结点的左子树的深度减去右子数的深度,则平衡二叉树所有结点的平衡因子可能是 -1 、0、1.只要二叉树上有一个结点的平衡因子的绝对值大于1,那个该二叉树就不平衡。
在这幅图中,a是平衡的二叉树,b是不平衡的二叉树。且每个节点的平衡因子也都写在节点上了。
图一 平衡因子
三、构建平衡二叉树以及添加
指针a确定:a是离插入节点最近,且DF超过1的祖先节点。解决不平衡的方法:旋转
1.单向右旋:由于在*a的左子树根节点的右子树上插入节点,a的平衡因子由1变为2,向右顺时针旋转。
2.单向左旋:由于在*a的右子树根节点的右子树上插入节点,a的平衡因子由1变为2,向左顺时针旋转。
3.先左后右:由于在*a的右子树根节点的右子树上插入节点,a的平衡因子由1变为2,做两次旋转,先左旋转,再右旋转。
4.先右后左:由于在*a的右子树根节点的左子树上插入节点,a的平衡因子由1变为2,做两次旋转,先右旋转,再左旋转。
精华:
LL:单右转 RR:单左转 LR:先左后右 RL:先右后左
图二 旋转
小编用一个例子来说明一下构建的过程:假设把(13,24,37,90,53)构建成平衡二叉树。
a)刚开始的时候是一颗空树;
b)把第一个数13插入,13当成根节点;
c)把24插入,因为24大于13,所以要插入到13的左子树;
d)然后把37插入,同理,37大于13,37大于24,插入到24的左子树;插入后,13节点的平衡因子是-2,将大于1,是一种不平衡现象。所以要对树进行调整:属于RR,所以要单左转。
e)接下来,插入90,没有问题。然后插入53,插入后出现不平衡,所以要调整,属于RL,需要先进行左旋转,再进行右旋转。
这里旋转可能有点费劲,这里是难点:因为37的平衡因子是-2,所以是不平衡的,再看是RL型,先把53插入到37和90之间,如图g,然后就变成了RR型,需要把37降下了,如图h,把37、53、90拉到一条线上,然后重新排序。得到g图。
f)此时37、53、90在一条直线上,他们是不平衡的,37的DF是-2,属于是RR,需要向左旋转,得到下面的结果。
四、小结
最近刚开始的时候自己也不会,就百度了一下,向聚哥请教,总结了最后的做题的结果,知道了如何去做。这个过程还是很好的,加油!总之,学习不能总一直开车狂奔,也要停下来给自己稍微加点油,这样自己才不会感觉到累。相关文章推荐
- 链表的java实现以及基本的增加,删除,排序操作
- jquery判断select中是否存在某个value以及进行增加、删除操作
- [置顶] QEE2.1 色色修改版 - 增加多级目录模块结构以及扩展web自动构建工具
- 有向图的十字链表存储表示 以及相关操作(包括增加弧、删除弧、删除顶点等)
- [置顶] c++排序二叉树的出现的私有函数讨论,以及二叉树的删除操作详解
- 有向图的十字链表存储表示 以及相关操作(包括增加弧、删除弧、删除顶点等)
- 针对Oracle表 列字段的增加、删除、修改以及重命名操作sql
- 支持O(1)时间增加,删除和随机选择操作的数据结构
- [置顶] Annaconda 增加删除镜像 channel, 以及其他python包安装解决办法
- 如何在DataGrid控件中实现编辑、删除、分类以及分页操作
- DataGrid控件(可以实现不刷新增加删除等操作)
- 利用JDOM及XPath对XML文件进行创建、查找、增加、删除、保存等操作
- 如何在DataGrid控件中实现编辑、删除、分类以及分页操作
- ASP.NET中数据库的操作初步----增加、删除、修改
- ASP.NET中数据库的操作初步----增加、删除、修改
- 使用OTL对oracle数据库进行增加,删除,编辑和查询操作。
- 数据结构:线性表删除操作的php和js实现
- ASP.NET中数据库的操作初步----增加、删除、修改
- [ZT]Treeview增加、删除、修改、遍历等操作
- js里对options的增加删除提交操作