您的位置:首页 > 理论基础 > 数据结构算法

数据结构 - 红黑树(Red Black Tree)删除详解与实现(Java)

2018-09-18 17:39 851 查看
  本篇要讲的就是红黑树的删除操作

      红黑树插入操作请参考 数据结构 - 红黑树(Red Black Tree)插入详解与实现(Java)

  红黑树的删除是红黑树操作中比较麻烦且比较有意思的一部分。

  在此之前,重申一遍红黑树的五个定义:

    1. 红黑树的节点不是黑色的就是红色的

    2. 红黑树的根节点一定是黑色的

    3. 红黑树的所有叶子节点都是黑色的(注意:红黑树的叶子节点指Nil节点)

    4. 红黑树任何路径上不允许出现相邻两个红色节点

    5. 从红黑树的任一节点开始向下到任意叶子节点所经过的黑色节点数目相同

  接着,请大家谨记你操作的对象都是一颗标准的红黑树,所以不要脑补过多不能存在的情况,如果你考虑的情况不在本文的讨论范围之内,可以往上看看是不是你的情况违反了五条规则其中某一条,若还有疑问,欢迎留言讨论。



  

private void delete_black_leaf(TreeNode node, boolean needDel) {
TreeNode parent = node.getParent();
if (null != parent) {
boolean nodeInLeft = parent.getLeft() == node;
TreeNode sibling = nodeInLeft ? parent.getRight() : parent.getLeft();
TreeNode remoteNephew = null == sibling ? null : (nodeInLeft ? sibling.getRight() : sibling.getLeft());
TreeNode nearNephew = null == sibling ? null : (nodeInLeft ? sibling.getLeft() : sibling.getRight());
if (sibling.getColor() == NodeColor.RED) {
delete_sibling_red(node);
} else if (null != remoteNephew && remoteNephew.getColor() == NodeColor.RED) {
delete_remote_nephew_red(node);
} else if (null != nearNephew && remoteNephew.getColor() == NodeColor.RED) {
delete_near_nephew_red(node);
} else {
// the sibling is also a leaf
if (parent.getColor() == NodeColor.RED) {
delete_parent_red(node);
} else {
sibling.setColor(NodeColor.RED);
delete_black_leaf(parent, false);
}
}
}
if (needDel) {
if (null == parent) {
this.root = null;
} else if (node.getParent().getLeft() == node) {
parent.setLeft(null);
} else {
parent.setRight(null);
}
}
}


private void delete_black_leaf(TreeNode node, boolean needDel)
  删除叶子节点包含了另外一个参数 boolean needDel ,因为上面提到的有些情况需要继续上溯,所以有些节点不能被删除。

  红黑树所有操作大功告成,希望对大家的学习有所帮助。

  PS:请问大家有可以画好看的二叉树的软件推荐吗

  请尊重知识产权,引用转载请通知作者!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: