数据结构
数组
特点:
1,使用前要预先分配空间,先指定数组长度,内存地址连续。
2,可以使用数组下标访问成员,查询效率高。
3,增删会带来系统性能消耗。保证数组下标越界问题,需要动态扩容。
链表
单向链表
双向链表
特点:
1,存储空间不要求连续,空间要求灵活
2,不支持下标访问,查询需要顺序遍历
3,增删效率高,只需要操作目标节点的前后节点,无需移动元素
树
二叉树
特点:
1,节点的左子树的节点小于该节点
2,节点的右子树的节点大于该节点
3,左右子树也都是二叉查找树
4,顺序排列(中序遍历)
不平衡二叉树查询效率不高,极端情况等于链表的查询效率,我们可以通过去除顶端优势让不平衡二叉树变成平衡二叉树。提高查询效率。
红黑树
红黑树 Red-Block Tree 是一个自平衡的二叉查找树,树上的节点满足如下的规则
1,每个节点要么是红色,要么是黑色
2,叶子节点必须是黑色
3,叶子节点是黑色
4,每个红色节点的两个子节点必须是黑色
5,任意节点到每个叶子节点的路径包含相同数量的黑节点
实现方式
1,recolor 重新标志节点颜色
2,rotation 旋转 树达到平衡的关键
红黑树自平衡实现方式
左旋:以某个节点作为支点(旋转节点),其右子节点变为旋转节点的父节点,右子节点的左子节点变为旋转节点的右子节点,左子节点保持不变。
右旋:以某个节点作为支点(旋转节点),其左子节点变为旋转节点的父节点,左子节点的右节点变为旋转节点的左节点,右子节点保持不变。
变色:节点颜色由黑变红或由红变黑。
插入场景
1,树为空
插入节点作为根节点,设置为黑节点
2,插入节点的父节点为黑节点
直接插入
3,插入节点的父节点为红节点
叔叔节点为红色
1,将父节点和叔叔节点设置为黑色
2,将祖父节点设置为红色
3,将祖父节点设置为当前插入节点(在套用一次规则)
叔叔节点不存在或者为黑色
父节点是左节点
插入节点是父节点的左节点
1,将父节点设置为黑色
2,将祖父节点设置为红节点
3,祖父节点右旋
插入节点是父节点的右边节点
1,父节点左旋
2,把父节点设置为插入节点,得到上面的场景
3,套用上面的规则
父节点是右节点
插入节点是父节点的右节点
1,将父节点设置为黑色
2,将祖父节点设置为红色
3,祖父节点镜像左旋
插入节点是父节点的左节点
1,父节点进行右旋
2,把父节点设置为插入节点,得到上面的场景
3,套用上面的规则