二叉排序(查找)树的调整
2015-09-30 16:12
134 查看
一大考点,不得不去研究下,根源是想get这一技能,搞懂了,也就没什么了
二叉排序树是一种特殊的、增加了限制条件的二叉树,它是实现动态查找的树表,而且是在查找过程中动态生成的,即对于给定key,若表中存在与key相等的元素,则查找成功,不然,插入关键字等于key的元素
一棵二叉排序树,又称二叉查找树,它要么是一棵空二叉树,或者是具备以下性质的二叉树:
1.若它的左子树不空,则左子树上所有结点的键值均小于它的根结点键值
2.若它的右子树不空,则右子树上所有结点的键值均大于它的根结点键值
3.根的左、右子树也分别为二叉排序树
但是,并不是所有的二叉排序树都是平衡的,二叉排序树的引出是为了查找,如果查找效率不高,岂不是事倍功半,所以,就衍生了二叉排序树的调平,在平衡二叉树中插入结点与二叉查找树最大的不同在于要随时保证插入后整棵二叉树是平衡的。调整不平衡二叉树的基本方法就是:旋转。这里有四种方法:LL,RR,RL,LR,非常简单,大家听我叨起来:
平衡因子(平衡度):结点的平衡度是结点的左子树的高度-右子树的高度
规定:平衡二叉树的每个结点的平衡因子都为+1,-1或0。或者说是 每个结点的左右子树的高度最多差一的二叉树
所以:
一棵平衡二叉树或者是空树,或者是具有以下性质的二叉排序树:
1.左子树与右子树的高度之差的绝对值小于等于1
2.左子树和右子树也是平衡二叉排序树
重点来了:不平衡二叉树的调整: LL RR LR RL
原则:谁不平衡就动谁
方法一:LL
单向右旋平衡处理,如图,我理解的右旋就是右边的旋转,由于A的左子树根结点B的左子树插入了一个节点,A的平衡因子由1增为2,使以A为根的子树失去平衡,需进行一次向右的顺时针旋转操作。
例子:
方法二:RR
单向左旋平衡处理:由于A的右子树根结点B的右子树上插入节点,A的平衡因子由-1变为-2,使A失去平衡。进行一次向左的逆时针旋转,如图
例子:
方法三:LR
由于A的左子树根结点B的右子树插入节点,使B失去平衡。进行两次旋转,先左旋后右旋
例子:
方法四:RL
由于A的右子树的根结点B的左子树插入节点,使其失去平衡。进行两次旋转,先右旋,后左旋。
例子:
二叉排序树是一种特殊的、增加了限制条件的二叉树,它是实现动态查找的树表,而且是在查找过程中动态生成的,即对于给定key,若表中存在与key相等的元素,则查找成功,不然,插入关键字等于key的元素
一棵二叉排序树,又称二叉查找树,它要么是一棵空二叉树,或者是具备以下性质的二叉树:
1.若它的左子树不空,则左子树上所有结点的键值均小于它的根结点键值
2.若它的右子树不空,则右子树上所有结点的键值均大于它的根结点键值
3.根的左、右子树也分别为二叉排序树
但是,并不是所有的二叉排序树都是平衡的,二叉排序树的引出是为了查找,如果查找效率不高,岂不是事倍功半,所以,就衍生了二叉排序树的调平,在平衡二叉树中插入结点与二叉查找树最大的不同在于要随时保证插入后整棵二叉树是平衡的。调整不平衡二叉树的基本方法就是:旋转。这里有四种方法:LL,RR,RL,LR,非常简单,大家听我叨起来:
平衡因子(平衡度):结点的平衡度是结点的左子树的高度-右子树的高度
规定:平衡二叉树的每个结点的平衡因子都为+1,-1或0。或者说是 每个结点的左右子树的高度最多差一的二叉树
所以:
一棵平衡二叉树或者是空树,或者是具有以下性质的二叉排序树:
1.左子树与右子树的高度之差的绝对值小于等于1
2.左子树和右子树也是平衡二叉排序树
重点来了:不平衡二叉树的调整: LL RR LR RL
原则:谁不平衡就动谁
方法一:LL
单向右旋平衡处理,如图,我理解的右旋就是右边的旋转,由于A的左子树根结点B的左子树插入了一个节点,A的平衡因子由1增为2,使以A为根的子树失去平衡,需进行一次向右的顺时针旋转操作。
例子:
方法二:RR
单向左旋平衡处理:由于A的右子树根结点B的右子树上插入节点,A的平衡因子由-1变为-2,使A失去平衡。进行一次向左的逆时针旋转,如图
例子:
方法三:LR
由于A的左子树根结点B的右子树插入节点,使B失去平衡。进行两次旋转,先左旋后右旋
例子:
方法四:RL
由于A的右子树的根结点B的左子树插入节点,使其失去平衡。进行两次旋转,先右旋,后左旋。
例子:
相关文章推荐
- 利用epoll统一调度信号、定时器和事件
- LeetCode题解——Convert Sorted Array to Binary Search Tree
- hdu2612Find a way bfs
- Axure在Windows系统下的安装
- Jenkins TFS配置
- (非原)SQL注入专题--整理帖 && like 语句拼sql 如何防止注入攻击。
- .NET小笔记-NPOI读取excel内容到DataTable
- 常用 Java 静态代码分析工具的分析与比较
- [备忘] redis 生产环境配置
- 垂直居中
- 播客·伴我行·9月份英语
- 使用IntelliJ IDEA 14和Maven创建java web项目
- Android手机拍照上传旋转90度问题
- 千里码-git
- Java多线程文件下载
- 实现从一个应用程序内部跳转到另一个应用程序的Demo
- c++ 什么情况下需要将基类的析构函数声明为虚函数
- 博客迁移
- 学习ThinkPHP3.2.2(三):读取指定的记录
- 软件开发,怎么才能做好呢?(一)