平衡二叉树的插入和旋转
2016-06-23 22:10
337 查看
平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性质的二叉树:它的左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。
//关于树的一些概念上的纠正:1.树的深度是从根节点开始(其深度为1)自顶向下逐层累加的,而高度是从叶节点开始(其高度为1)自底向上逐层累加的。
2.虽然树的深度和高度一样,但是具体到树的某个节点,其深度和高度是不一样的。
3.我的理解是:非根非叶结点的深度是从根节点数到它的,高度是从叶节点数到它的
/*也就是说:从下往上叫高,上往下叫深*/
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
特点:给定结点数为N的AVL树的最大高度为log2N
最小不平衡子树:指离插入节点最近且以平衡因子的绝对值大于1的节点作为根的子树。
平衡因子(bf):结点的左子树的深度减去右子树的深度,|bf|<=1;
插入操作:(在平衡二叉树的基础上进行插入操作,二叉树实时为平衡二叉树)
1) 左单旋(LL旋转): 在最小平衡子树根节点平衡因子>=2且在根节点的左孩子的左孩子插入元素,进行左旋(图片中“右旋”->“左旋”):
注:70为不平衡的发现者,20为麻烦结点(在发现者左子树的左子树)
2)右单旋(RR旋转): 在最小平衡子树根节点平衡因子>=-2且在根节点的右孩子的右孩子插入元素,进行右旋(图中“左旋”->“右旋”):
注:100为不平衡的发现者,140为麻烦结点(在发现者右子树的右子树)
3) 右左:最小平衡子树根节点(80)的右孩子(100)的左孩子(90)的子节点(95)插入新元素,先绕根节点的右孩子节点(100)右旋,再围根节点(80)左旋:
4)左右:基本同上!!
有什么问题可以共同探讨哈,谢谢!
相关文章推荐
- eclipse无法打开“Failed to load the JNI shared library”【转】
- 修改 Android Studio for mac中Ctrl + 左键 = 右键的功能
- [Andriod]自定义控件一
- Spark:一个高效的分布式计算框架
- linux如何查看一个进程的堆栈
- HBase中的僵尸表
- 2023求平均成绩
- Android 自定义控件 轻松实现360软件详情页
- eclipse jad 反编译 插件安装
- Spring-Mvc里@RequestMapping的6个基本小用法
- 文章标题
- 微信查询高考分数已支持20个城市
- 草草弄完SPRING WEB-FLOW
- Harris角点检测原理及实现
- Spring 循环引用(singleton与prototype初始化的区别)
- FPGA经验分享——时序收敛之路
- JFreeChart折线图,饼图,柱状图 【转载】
- ACM血一般的经验
- 外部排序 多路合并
- C++中map注意事项