调整平衡二叉树
来源:互联网 发布:freehand软件用法 编辑:程序博客网 时间:2024/04/27 17:00
平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性质的二叉树:它的左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。
最小不平衡子树:指离插入节点最近且以平衡因子的绝对值大于1的节点作为根的子树。
平衡因子(bf):结点的左子树的深度减去右子树的深度,那么显然-1<=bf<=1;
很显然,平衡二叉树是在二叉排序树(BST)上引入的,就是为了解决二叉排序树的不平衡性导致时间复杂度大大下降,那么AVL就保持住了(BST)的最好时间复杂度O(logn),所以每次的插入和删除都要确保二叉树的平衡,那么怎么保持平衡呢?
插入操作
在平衡二叉树中插入结点与二叉查找树最大的不同在于要随时保证插入后整棵二叉树是平衡的。那么调整不平衡树的基本方法就是: 旋转,基本思路都是转换到左旋和右旋。
1) 右旋: 在最小平衡子树根节点平衡因子>=2且在根节点的左孩子的左孩子插入元素,进行右旋
2) 左旋: 在最小平衡子树根节点平衡因子>=-2且在根节点的右孩子的右孩子插入元素,进行左旋。
3) 右左:最小平衡子树根节点(80)的右孩子(100)的左孩子(90)的子节点(95)插入新元素,先绕根节点的右孩子节点(100)右旋,再围根节点(80)左旋
4) 左右:在最小平衡子树根节点(80)的左孩子(50)的右孩子(70)的子节点插入新元素,先绕根节点的左孩子节点(50)左旋,再围根节点(80)右旋
右旋:变为原左节点的右儿子,原左节点的右子树变为该节点的左子树
左旋:变为原右节点的左儿子,原右节点的左子树变为该节点的右子树
LL型——>右旋
RR型——>左旋
LR型——>左孩子左旋,然后右旋
RL型——>右孩子右旋,然后左旋
关键在于找到最小不平衡子树
0 0
- 平衡二叉树调整
- 平衡二叉树调整
- 平衡二叉树调整
- 调整平衡二叉树
- 平衡二叉树调整
- 平衡二叉树的调整
- 平衡二叉树及调整
- 平衡二叉树的调整
- 平衡二叉树的调整
- 平衡二叉树的调整方法
- 面试训练调整平衡二叉树
- 平衡二叉树的调整模版
- 平衡二叉的调整规则
- 平衡二叉树结点的插入和调整
- 平衡二叉树的四种调整方式和注意事项
- 关于平衡二叉树(AVL tree)旋转后平衡标志调整的计算公式
- 平衡二叉查找树插入节点操作( AVLTree ):旋转、调整平衡
- 平衡二叉树平衡法则
- android 动态addview注意
- JavaScript 如何给对象添加方法
- 括号法递归建立二叉树并层序遍历输出
- matlab cross 3*1 向量叉乘
- 《ActiveMQ In Action》Chapter 2 Understanding message-oriented middleware and JMS
- 调整平衡二叉树
- SlidingPaneLayout入门
- 第四十课——穷举
- BZOJ 1053 - 反素数(搜索)
- Android studio gradle配置
- Oracle 游标使用
- SSH随笔
- [Python标准库]Queue——线程安全的 FIFO 实现
- leetcode刷题日记——Missing Number