一个节点 = 一个对象 = 父节点地址值+数据值 + 左子节点地址值 + 右子节点地址值
度:每个节点的子节点数量;即:子节点数量(度)
二叉树中,任意一个节点的度(子节点数量)都要小于等于2
层 = 高度
根节点:第一层节点
根节点的左子树节点:根节点左边的所有节点
更节电的右子树节点:根节点右边的所有节点
二叉树 | 无序,查找时需要一个节点一个节点查 |
二叉查找数 | 左小右大(可能导致一侧过长,不能保证平衡),查找层级比较大 |
平衡二叉树 | 左小右大,保持平均分布(查询时不用经过那么多层) 保持绝对平衡:左右两个子树的高度差不超过1(可等于1) |
红黑树 | 相对平衡,有自己的规则(不用经常触发旋转机制) |
二叉树:(普通树)--无序的
树里的每一个元素称之为节点
每一个节点最多有两个子节点
二叉查找树:
(也称二叉排序树、二叉搜索树)
特点:
1.每个节点最多有2个子节点
2.每个节点的左子节点都小于自己
3.每个节点的右子节点都大于自己
存入节点规则:
1.小的存左边
2.大的存右边
3.一样的不存
平衡二叉树:
1.左右两个子树的高度差不超过1(可等于1)
2.任意节点的左右两个子树都是平衡二叉树(注意:是每一个节点)
当添加一个节点后,该树不再是一颗平衡二叉树
会触发机制:左旋、右旋
左旋:
只旋最外层,若旋后的根节点带左子节点,那左子节点会更左子树一一对比,小存左,大存右
右旋:
只旋最外层,若旋后的根节点带右子节点,那右子节点会更右子树一一对比,小存左,大存右
被旋转的四种情况:
左 左:右旋
左 右:左子树先左旋,最外层再右旋
右 右:左旋
右 左:右子树右旋后,最外层再左旋
左边这列字:根(左)(右)子树
右边这列字:以 根(左)(右)子树 的第一层作为根节点,在根节点的左子树添加,或在右子树添加
红黑树:
1.以前称为平衡二叉B树
2.每一个节点可以是红色可以是黑色
3.红黑树不是高度平衡的,它的平衡是通过“自己的红黑规则”实现
红黑规则:
1.每个节点或是红色,或是黑色
2.根节点必须是黑色
3.如果一个节点没有子节点或父节点,则该节点指针属性为nil(也称叶节点,都是黑色的)(nil可看左null)
4.如果某个节点是红色,那它的子节点必须是黑色的(不能出现两个红色节点相连情况)
5.对每个节点,从该节点到其所有后代叶节点的简单路径上(只能往前,不能回头),均包含相同数目的黑色节点
在节点上多了一个属性:颜色
一个节点 = 一个对象 = 父节点地址值+数据值 + 左子节点地址值 + 右子节点地址值+颜色
当添加3个全黑的节点,需要变动两次
当添加3个全红的节点,只需变动一次
所以,添加节点时,默认红色,效率更高
父节点为黑色,无需任何操作
其父节点为红色,叔叔也是红色
1.将叔父变黑
2.将祖父变红
3.若祖父为根节点,则再次变黑
其父节点为红色,叔叔为黑色(叔叔为nil节点也算黑色)
1.将父变黑
2.祖父变红色
3.以祖父为支点进行旋转(旋转时,nil节点可以忽略,都是null可以不看)