二叉树
数据结构:
-
平衡二叉树:任意节点的左右子树的高度差不能超过1;
-
确定支点:从添加的节点开始,不断的父节点找不平衡点;
- 左旋
- 【确定支点在根节点的右子树】:
- 以不平衡点作为支点;
- 把支点左旋转降级,变成左节点;
- 晋升原来的右节点;
- 【确定支点在根节点】
- 以不平衡点作为支点;
- 将根节点左旋转,降级,为根的左节点;
- 晋升根节点的右节点,为根节点
- 原来右节点的的左节点,变为现在左节点的右子节点;
- 【确定支点在根节点的右子树】:
- 右旋转:
- 【确定支点在根节点的左子树】:
- 以不平衡点作为支点;
- 把支点右旋转降级,变成右节点;
- 晋升原来的左节点;
- 【确定支点在根节点】
- 以不平衡点作为支点;
- 将根节点右旋转,降级,为根的右节点;
- 晋升根节点的左节点,为根节点
- 原来左节点的的右节点,变为现在右节点的左子节点;
- 【确定支点在根节点的左子树】:
- 导致不平衡的四种情况:
- 左左【节点添加到根节点的左子树的左子树上导致不平衡】:一次右旋;
- 左右:先局部左旋,在整体右旋;
- 右右:一次左旋;
- 右左:先局部右旋,在整体左旋;
- 左旋
-
红黑树:一种特殊的二叉查找树;
-
没有平衡二叉的条件严格;
-
红黑树的每一个节点,都右储存位标识节点的颜色;
-
红黑树规则:
- 每一个节点:不是红色就是黑色;
- 根节点必须是黑色;
- 如果一个节点,没有子节点或者父节点,则该节点相应指针属性值为nil,这些nil视为叶节点,且每个叶节点都是黑色的【红色节点不能作为结尾】;
- 如果一个节点是红色的,那么他的子节点必须是黑色的【不能出现两个红色节点相连的情况】;
- 对于每个节点,从该节点到其所有后代叶节点的简单路径【不能回头】上,均包含相同数目的黑色节点;
-
添加节点规则:
- 添加节点默认是红色的效率更高;
- 添加为根节点,直接变为黑色;
- 添加节点为非根节点:
- 父为黑色节点,不需要操作【默认颜色的作用】;
- 父为红色【相邻不能同为红色】:
- 叔叔为红色节点时:
- 将父和叔,都设置为黑色节点;
- 将祖父设置为红色节点;
- 如果祖父为根节点,则变为黑色节点;
- 如果祖父不是根节点,将祖父作为当前节点【添加节点】,在进行重新判断;
- 当叔叔为黑色节点:
- 当前节点是父节点的右节点时:
- 把父作为当前节点,并左旋,在进行重新判断;
- 当前节点是父节点的左节点时:
- 将父节点设置为黑色,
- 祖父变为红色;
- 以祖父节点为支点进行右旋转【旋转不考虑nil节点】;
- 当前节点是父节点的右节点时:
- 叔叔为红色节点时:
-

浙公网安备 33010602011771号