AVL树 和 红黑树 的插入算法
1.AVL树
按照二叉搜索树的规则找到要插入的位置并插入,插入过后看是父节点的左还是右孩子,然后把父节点的平衡因子-1或+1,调整后如果父节点的平衡因子是0,那就说明这颗子树的高度插入前后不变,上面的就不用调整平衡因子了,到此结束。如果调整后如果父节点的平衡因子是1或-1,那就说明该子树的高度变化了,那就往上走。走了之后看是左孩子还是右孩子,然后给父节点的平衡因子-1/+1,然后看调整后的结果,如果是0或+/-1那和上一次处理一样,不再多说,如果是+/-2,那就开旋~,记该节点为Parent
1.parent节点平衡因子+2
那说明右边高,那就看看右边怎么个事,看右孩子的平衡因子
a.右孩子subR的平衡因子是+1
那说明还是右边高,直接左旋parent节点,subR平衡因子是变成0,parent平衡因子变成0
b.右孩子sub的平衡因子是-1
这种情况要先变成完全不平衡那种,即先右旋subR节点,然后就变成了上面那种完全不平衡的样子,然后左旋parent节点,旋转很简单,平衡因子有点难调。我们要根据subRL,也就是subR的左孩子来调整平衡因子,
如果subRL的平衡因子是0,subRL=0 parent=0 subR=0
如果subRL的平衡因子是1,subRL=0 parent=-1 subR=0
如果subRL的平衡因子是-1,subRL=0 parent=0 subR=1
2.parent节点平衡因子-2
思考方式和+2一样
2.红黑树
按照二叉搜索树的方式找到要插入的位置并插入,节点默认应该是红色而不是黑色,因为红色插入的话不一定会破坏红黑树的规则,而黑色节点插入一定会破坏每条路径上黑色节点个数相同这个规则。插入红色节点后,如果父节点是黑色,那就什么规则都没破坏,结束了。如果父节点是红色,那不能有相邻红色节点,所以要调整,插入这个结点之前应该满足是红黑树,所以父节点是红色说明爷爷节点一定是黑色,这时的关键就是叔叔节点也就是爷爷结点的另一个子节点
1.叔叔节点是红色
那直接把父节点和叔叔节点变成黑色,爷爷节点变成红色,然后继续往上调整,爷爷节点就变成了新加入的红色节点,正如一开始的孙子节点一样
2.叔叔节点是黑色或不存在
这个时候要开旋了~
爷爷节点记为parent,
a.假如父节点是subL
也就是爷爷节点的左孩子,然后当前节点subLL,也就是父节点的左节点,那就右旋parent,然后parent变为红色,父节点变为黑色;当前节点是subLR,也就是当前节点是父节点的右孩子,那就先左旋subL,变成上一种情况那种样子,然后右旋parent,改parent为红色,subL为黑色
b.假如父节点是subR
然后分类当前节点如上