来自Data Structures and Problem Solving Using Java找到here的原始Mark Allen Weis RedBlackTree实施。
我似乎无法理解从树中移除节点。在阅读wikipedia resource之后我注意到了“is_leaf()”函数..这个和Mark Weis实现的问题是没有办法分辨哪个节点是叶子而哪个不是
void delete_one_child(struct node *n)
{
/*
* Precondition: n has at most one non-null child.
*/
struct node *child = is_leaf(n->right) ? n->left : n->right;
replace_node(n, child);
if (n->color == BLACK) {
if (child->color == RED)
child->color = BLACK;
else
delete_case1(child);
}
free(n);
}
Is_Leaf java实现
public boolean isLeaf(){
if(left == null && right == null){
return false;
}
return true;
}
控制台输出
value=1 color=1 leaf=true left=null right=14
value=2 color=1 leaf=true left=null right=5
value=5 color=0 leaf=true left=null right=null
value=7 color=0 leaf=true left=2 right=11
value=8 color=0 leaf=true left=null right=null
value=11 color=1 leaf=true left=8 right=null
value=14 color=1 leaf=true left=7 right=15
value=15 color=1 leaf=true left=null right=null
树格式(来自控制台)
└── (1) 1
└── (1) 14
├── (0) 7
│ ├── (1) 2
│ │ └── (0) 5
│ └── (1) 11
│ └── (0) 8
└── (1) 15
规则:
所以我的问题是如何实现从this实现红树和背树的删除?
答案 0 :(得分:1)
我认为这是正确的isLeaf()代码:
public boolean isLeaf(RedBlackNode<AnyType> t ){
if(t.left.element == null && t.right.element == null){
return true;
}
return false;
}
答案 1 :(得分:0)
您是否在询问如何实施isLeaf()?如果是这样,您应该将isLeaf传递给您要检查的节点。
public boolean isLeaf(RedBlackNode<AnyType> t ){
if(t.left == null && t.right == null){
return false;
}
return true;
}
否则,算法本身看起来正确,唯一真正的工作是将C转换为Java,这很容易。
答案 2 :(得分:0)
您必须检查nullnode
而不是null
:
public boolean isLeaf() {
if(left == nullnode && right == nullnode) {
return false;
}
return true;
}