二叉树
特点:左子树小于右子树。
缺点:二叉树遇到按顺序的数据分叉的时候,二叉树实际就是个链表。
平衡二叉树
特点:左子树和右子树需要通过自旋方式平衡两边树的高低,可以避免链表的出现。
缺点:为了平衡左子树和右子树的高度相差不超过1,插入和删除节点需要频繁左旋和右旋,消耗性能。
红黑树
特点:
- 节点分为红色或者黑色;
- 根节点必为黑色;
- 叶子节点都为黑色,且为null;
- 连接红色节点的两个子节点都为黑色(红黑树不会出现相邻的红色节点);
- 从任意节点出发,到其每个叶子节点的路径中包含相同数量的黑色节点;
- 新加入到红黑树的节点为红色节点;如果树的黑色节点下面是红色节点,而此时新增的节点是红色的情况,需要完成树的旋转。
红黑树优化了平衡二叉树需要频繁自旋的场景,插入最多需要两次旋转,删除最多需要三次旋转,不需要顾忌左右子树的高度差1的情况,权衡下,红黑树插入和删除的效率其实更高。
左旋:逆时针旋转两个节点,让一个节点被其右子节点取代,而该节点成为右子节点的左子节点
右旋:顺时针旋转两个节点,让一个节点被其左子节点取代,而该节点成为左子节点的右子节点