在我的代码中,我创建了一个 TreeNode 类,其中每个节点都有一个 int N 字段,它是子树的数量,这是在随机 BTS 树中删除 TreeNode 的代码
void remove(int id)
{
if(isID(id)) {
removeR(head,id);
}else
{
System.out.println("There's no warehouse with that ID!");
}
}
private TreeNode removeR(TreeNode h,int id)
{
if (h==null) return null;
int TreeNodeID=h.getId();
if(id<TreeNodeID)
removeR(h.l,id);
if(id>TreeNodeID)
removeR(h.r,id);
if(id==TreeNodeID)
h=joinLR(h.l,h.r);
return h;
}
private TreeNode joinLR(TreeNode a,TreeNode b)
{
int NA=a.N+b.N;
if(a==null)
return b;
if(b==null)
return a;
if(Math.random()*NA<1.0*a.N)
{
a.r=joinLR(a.r,b);
return a;
} else
{
b.l=joinLR(a,b.l);
return b;
}
}
如果我插入例如 ID 为 1 的 TreeNode 并选择删除此节点,代码将执行:remove(id)->removeR(head,id)->h=joinLR(hl,hr),我的问题是即在joinLR函数中这段代码
int NA=a.N+b.N;
将使接下来的两个 ifs 死代码
if(a==null)
return b;
if(b==null)
return a;
我做了很多例子,如果我使用a或b代码将无法使用,唯一的解决方案是在两个ifs之后编写它,但是代码无法正常工作,有人知道吗?