树和二叉树(二)
来源:互联网 发布:linux怎么重启网卡 编辑:程序博客网 时间:2024/06/04 19:24
树和二叉树(二)
今天介绍一下常见的二叉树:
二叉排序树(查找二叉树)
定义:一棵查找二叉树要么是一棵空树,要么满足以下条件:
1、查找树的左右子树各是一棵查找树;
2、若查找树的左子树非空,则其左子树的各结点值均小于根结点值;
3、若查找树的右子树非空,则其右子树的各结点值均大于根结点值;
基本操作:查找;插入结点;删除结点
查找:就是从根结点开始与键值(key)比较,若键值较小则进入左子树,反之进入右子树,重复比较,直到键值等于结点的值。
插入结点:①如果相同键值的结点已在查找二叉树中,则不再插入。
②如果查找二叉树为空树,则以新结点为查找二叉树。
③将要插入结点的键值与插入后的父结点的键值比较,就能确定新结点是父结点的左子结点还是右子结点,并进行相应插入。
删除结点:①若待删除的结点P是叶子结点,则直接删除该结点。
②若待删除的结点P只有一个子结点,则将这个子结点与待删除结点的父结点直接连接,然后删除结点P。
③若待删除的结点P有两个子结点,则在其左子树上,用中序遍历寻找关键值最大的结点S,用结点S的值代替结点P的值,然后删除结点P的值
最优二叉树(哈弗曼树)
需要知道的概念:树的路径长度、权、结点的带权路径长度(路径长度乘以权值)、树的带权路径长度(所有叶子结点带权路径长度之和)
最优二叉树的定义:带权路径长度最小的树
构造哈弗曼树的过程:
例:假设一组权值为{5, 29, 7, 8, 14, 23, 3, 11},构造哈弗曼树的过程如下:
第一步:以这8个权值作为根结点的权值构造具有8棵树的森林;
第二步:从中选择两个根的权值最小的树3, 5作为左右子树构造一棵新树,并将这两棵树从森林中删除,并将新树添加进去;
第三步:重复第二步过程,注意新树的根也要比较,直到森林中只有一棵树为止;
哈弗曼树的一个特征:只有叶子结点和度为2的结点
线索二叉树
为什么要有线索二叉树:
普通二叉树的结点存储结构为:
LchildDateRchild叶子结点的左右指针都为空,造成存储空间的浪费线索二叉树利用了叶子结点的空指针,左指针域指向前驱,右指针域指向后继,这两个指针称为线索
线索二叉树的表示:
LbitLchildDateRchildRbit 对标志域规定如下:Lbit=0, Lchild是通常的指针
Lbit=1, Lchild是线索
Rbit=0, Rchild是通常的指针
Rbit=1, Rchild是线索
如何将二叉树转化为线索二叉树:构造前序线索二叉树,中序线索二叉树,后序线索二叉树。
1、对树进行遍历,结点的前驱是左边字母,后继是右边字母
2、将空结点的左右指针按遍历顺序进行连线,所得到的的二叉树就是线索二叉树
线索二叉树的一个特征:若某结点父结点没有右孩子,则该结点后继是父结点
平衡二叉树
定义:平衡二叉树要么是空树,要么是一棵这样的树:
树中任一结点的左、右子树的深度相差不超过1。
平衡二叉树的构造
在一棵二叉查找树中插入结点后,调整其为平衡二叉树。若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树根结点的指针。然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树
1.调整方法
(1)插入点位置必须满足二叉查找树的性质 ,即任意一棵子树的左结点都小于根结点,右结点大于根结点
(2)找出插入结点后不平衡的最小二叉树 进行调整,如果是整个树不平衡,才进行整个树的调整。
2.调整方式
(1)LL型
LL型:插入位置为左子树的左结点,进行向右旋转
由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1变为2,成为不平衡的最小二叉树根结点。此时A结点顺时针右旋转,旋转过程中遵循“旋转优先”的规则,A结点替换D结点成为B结点的右子树,D结点成为A结点的左孩子。
(2)RR型
RR型:插入位置为右子树的右孩子,进行向左旋转
由于在A的右子树C的右子树插入了结点F,A的平衡因子由-1变为-2,成为不平衡的最小二叉树根结点。此时,A结点逆时针左旋转,遵循“旋转优先”的规则,A结点替换D结点成为C的左子树,D结点成为A的右子树。
(3)LR型
LR型:插入位置为左子树的右孩子,要进行两次旋转,先左旋转,再右旋转;第一次最小不平衡子树的根结点先不动,调整插入结点所在的子树,第二次再调整最小不平衡子树。
由于在A的左子树B的右子树上插入了结点F,A的平衡因子由1变为了2,成为不平衡的最小二叉树根结点。第一次旋转A结点不动,先将B的右子树的根结点D向左上旋转提升到B结点的位置,然后再把该D结点向右上旋转提升到A结点的位置。
(4)RL型
RL型:插入位置为右子树的左孩子,进行两次调整,先右旋转再左旋转;处理情况与LR类似。
- 树和二叉树(二)
- 树和二叉树(二)
- 树和二叉树(二)
- 二叉树(二)
- 二叉树(二)
- 二叉树(二)
- 二叉树(二)
- (二)二叉树
- 第六章 树和二叉树(二)
- 树(二)二叉树递归和非递归遍历
- 【数据结构】——-树和二叉树(二)
- (二)二叉树的还原和遍历
- 二叉查找树(二)
- 二叉树重建(二)
- 二叉树学习(二)
- 二叉树整理(二)
- 二叉树设计(二)
- 线索二叉树(二)
- [BZOJ4010]菜肴制作 拓扑排序+堆
- 法规及
- 802.11帧格式
- 调用系统成功失败函数
- 最好的前端源码教程,html5、css3,js,bootsrap,query,前端全栈教程视频、文档、软件
- 树和二叉树(二)
- GPL 和BSD和Apache之间的区别和联系
- apache如何设置缓存
- Android WebView 播放微信视频的设置
- 后缀数组题目小结。
- 欢迎使用CSDN-markdown编辑器
- SpringMVC——使用JSR-303进行校验
- 常见的查找算法
- ORACLE 正负数分开排序 SQL