Странное взаимодействие в коде структуры данных для рандомизированного дерева двоичного поиска
В моем коде я создал класс TreeNode, где каждый узел имеет поле int N, которое является числом поддеревьев, это код для удаления TreeNode в рандомизированном дереве BTS
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;
}
}
Если я вставлю, например, TreeNode с идентификатором 1 и выберу удалить этот узел, код будет делать: удалить (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, но тогда код не будет работать должным образом, у кого-нибудь есть идеи?