4.数据结构
4.1二叉树【理解】
-
二叉树的特点
- 二叉树中,任意一个节点的度要小于等于2
- 节点: 在树结构中,每一个元素称之为节点
- 度: 每一个节点的子节点数量称之为度
- 二叉树中,任意一个节点的度要小于等于2
-
二叉树结构图
4.2二叉查找树【理解】
-
二叉查找树的特点
- 二叉查找树,又称二叉排序树或者二叉搜索树
- 每一个节点上最多有两个子节点
- 左子树上所有节点的值都小于根节点的值
- 右子树上所有节点的值都大于根节点的值
-
二叉查找树结构图
-
二叉查找树和二叉树对比结构图
-
二叉查找树添加节点规则
- 小的存左边
- 大的存右边
- 一样的不存
-
二叉查找树查找节点规则
4.2二叉树遍历【理解】
- 前序遍历:从根结点开始,然后按照当前结点,左子结点,右子结点的顺序遍历
- 中序遍历:从最左边的子节点开始,然后按照左子结点,当前结点,右子结点的顺序遍历
- 后序遍历:从最左边的子节点开始,然后按照左子结点,右子结点,当前结点的顺序遍历
- 层序遍历:从最左边的子节点开始,然后按照左子结点,右子结点,当前结点的顺序遍历
小结
4.3平衡二叉树【理解】
-
平衡二叉树的特点
- 二叉树左右两个子树的高度差不超过1
- 任意节点的左右两个子树都是一颗平衡二叉树
-
平衡二叉树旋转
-
旋转触发时机
- 当添加一个节点之后,该树不再是一颗平衡二叉树
-
左旋步骤:
-
第一种情况:支点没有左节点
- 第二种情况:支点有左节点
- 第二种情况:支点有左节点
-
-
右旋步骤
- 第一种情况:如果支点右边没有节点
- 第二种情况:如果支点右边有节点
-
-
平衡二叉树旋转的四种情况
-
左左
-
左左: 当根节点左子树的左子树有节点插入,导致二叉树不平衡
-
如何旋转: 直接对整体进行右旋即可
-
-
左右
-
左右: 当根节点左子树的右子树有节点插入,导致二叉树不平衡
-
如何旋转: 先在左子树对应的节点位置进行左旋,在对整体进行右旋
如果直接对支点右旋,则旋转完后,还是不平衡:
因此需要先把左子树左旋,然后整体右旋
-
-
右右
-
右右: 当根节点右子树的右子树有节点插入,导致二叉树不平衡
-
如何旋转: 直接对整体进行左旋即可
-
-
右左
-
右左:当根节点右子树的左子树有节点插入,导致二叉树不平衡
-
如何旋转: 先在右子树对应的节点位置进行右旋,在对整体进行左旋
假如我们只选转一次:
因此还需要旋转两次,先旋转右子树,在旋转整体
小结:
-
-
4.3红黑树【理解】
-
红黑树添加节点的默认颜色
- 添加节点时,默认为红色,效率高
- 如果默认是黑色的: 添加18节点:
添加18后,不符合红黑树规则第五条,即:对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点;
此时,只需要把18变成红色,即可满足5个条件:
然后添加23节点
添加完成后,又不符合第5条规则,因此,把23变成红色:
综上所述,发现需要调整2次, - 如果默认是红色的:
发现只调整了1次,因此添加节点默认是红色的效率高一点。
- 如果默认是黑色的: 添加18节点:
- 添加节点时,默认为红色,效率高
-
红黑树添加节点后如何保持红黑规则
-
添加20:
-
上图违背根节点必须是黑色,因此根节点变成黑色:
-
添加18
-
添加23
-
添加22:
-
上图违背第四个规则:两个红色节点不能相连,因此需要变换
- 将父设置为黑色(即23设置为黑),将叔叔设置为黑色(即18设置为黑)
- 将祖父设置为红色(即20变为红色):
- 如果祖父为根,则将根变为黑色(即20变为黑色)
- 将父设置为黑色(即23设置为黑),将叔叔设置为黑色(即18设置为黑)
-
添加17节点:
-
添加24节点和19节点都是没问题的:
-
如果新增两个节点,继续添加到红黑树:
-
添加15节点:
-
上图违背两个红色节点不能相连的原则,需要变换:
-
将父(17)设置为黑色,叔叔(19)设置为黑色,祖父节点(18)设为红色,现在祖父不是根节点,因此将祖父节点(18)设置为当前节点即(所添加元素的节点),继续判断:
-
18的父节点是黑色的,不需要任何操作,调整结束。
-
-
添加14节点:
-
上图违背了红色节点不能相连的规则,因此需要调整:
-
将父(15)变为黑色,将祖父(17)变为红色
-
以祖父为支点进行右旋,旋转的时候,不需要考虑叶子节点,旋转完后,再把叶子结点补上就行了:
-
-
假如刚刚添加的不是14节点,而是16节点:
-
添加16节点:
-
添加完成后,不满足两个红色节点不能相连的规则,进行调整
- 把父亲(15)当做当前节点,进行左旋,然后在进行判断
- 左旋完成后,还是不满足两个红色节点不能相连的规则,继续调整,以15为当前节点
-
将父(16)变成黑色,将祖父(17)变成红色
-
以祖父节点(17)为支点,进行右旋
-
- 把父亲(15)当做当前节点,进行左旋,然后在进行判断