Странное взаимодействие в коде структуры данных для рандомизированного дерева двоичного поиска

В моем коде я создал класс 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, но тогда код не будет работать должным образом, у кого-нибудь есть идеи?

0 ответов

Другие вопросы по тегам