数据结构 - 红黑树(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)
删除叶子节点包含了另外一个参数 boolean needDel ,因为上面提到的有些情况需要继续上溯,所以有些节点不能被删除。
红黑树所有操作大功告成,希望对大家的学习有所帮助。
PS:请问大家有可以画好看的二叉树的软件推荐吗
请尊重知识产权,引用转载请通知作者!
红黑树插入操作请参考 数据结构 - 红黑树(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:请问大家有可以画好看的二叉树的软件推荐吗
请尊重知识产权,引用转载请通知作者!
相关文章推荐
- 红黑树与C实现算法 - RedBlackTree.c
- [转载] 红黑树(Red Black Tree)- 对于 JDK TreeMap的实现
- 红黑树(RedBlackTree),平衡树(BalancedTree),SkipList 的实现
- C++数据结构 之 红黑树_Red Black Tree
- 红黑树Red-Black tree初步详解(Java代码实现)
- 红黑树(Red BlackTree)的实现
- 红黑树(Red Black Tree) - Flex实现
- C#与数据结构--树论--红黑树(RED BLACK TREE)
- 自平衡二叉查找树(二)-----------红黑树(redblack tree)分析和代码实现
- 红黑树(red black tree) Common Lisp 实现
- 红黑树(RedBlackTree)实现
- C#与数据结构--树论--红黑树(RED BLACK TREE)
- HashMap的原理与实 无锁队列的实现Java HashMap的死循环 red black tree
- 红黑树与C实现算法 - RedBlackTree.c
- 红黑树(red black tree)的实现
- 红黑树(Red Black Tree)
- 红黑树(Red Black Tree)
- 红黑树(Red Black Tree)
- 红黑树(Red Black Tree)
- 通过分析 JDK 源代码研究 TreeMap 红黑树算法实现 refer from http://www.ibm.com/developerworks/cn/java/j-lo-tree/index.html?ca=drs-