Arvore B

Estou implementando uma arvore binaria, mas estou errando.
Em c, é tranferido um ponteiro. Mas no java não trabalhamos com ponteiros e não consigo tornar um no nulo.
marquei o erro :

/**
 *
 * @author Luiz Augusto Prado
 */
public class No
{
    Integer Value;
    No noMin;
    No noMax;
}

 

/**
 *
 * @author Luiz Augusto Prado
 */
public class Action
{

    public String Insert(int Value, No no)
    {
        if (no.Value == null)
        {
            no.Value = Value;
            return "Inserido com sucesso";
        }
        else if (no.Value == Value)
        {
            return "Já existe";
        }
        else if (Value > no.Value)
        {
            if (no.noMax == null)
            {
                no.noMax = new No();
            }
            return Insert(Value, no.noMax);
        }
        else 
        {
            if (no.noMin == null)
            {
                no.noMin = new No();
            }
            return Insert(Value, no.noMin);
        }
    }

    public String Find(int Value, No no)
    {
        if (no == null || no.Value == null)
        {
            return "nao achou";
        }
        else if (no.Value == Value)
        {
            return "achou";
        }
        else if (Value > no.Value)
        {
            return Find(Value, no.noMax);
        }
        else 
        {
            return Find(Value, no.noMin);
        }
    }

    public String Delete(int Value, No no)
    {
        if (Value > no.Value)
        {
            return Delete(Value, no.noMax);
        }
        else if (Value < no.Value)
        {
            return Delete(Value, no.noMin);
        }
        else
        {
            if (no.noMax != null && no.noMin != null)
            {
                No aux = FindMin(no.noMax);
                no.Value = aux.Value;
                Delete(aux.Value, no.noMax);
            }
            else if (no.noMax == null && no.noMin == null)
            {
                no.Value = null; //   <----------------------------Erro? Sou obrigado a fazer essa gambiarra para funcionar.
                no = null;          //   <----------------------------não funciona! Estou sem idéia.
            }
            else if (no.noMax == null)
            {
                no = no.noMin;
            }
            else
            {
                no = no.noMax;
            }
        }
        return "Deletado";
    }

    public String ler(No no)
    {
        String resp = "";
        if (no.noMin != null)
        {
            resp += ler(no.noMin);
        }
        if (no.Value != null)
        {
            resp += " " + no.Value + " ";
        }
        if (no.noMax != null)
        {
            resp += "" + ler(no.noMax) + "";
        }
        return resp;
    }

    public No FindMin(No no)
    {
        if (no.noMin == null )
        {
            return no;
        }
        else
        {
            return FindMin(no.noMin);
        }
    }

    public No FindMax(No no)
    {
        if (no.noMax == null)
        {
            return no;
        }
        else
        {
            return FindMax(no.noMax);
        }
    }

    public static void main(String[] args)
    {
        Action Ac = new Action();
        No no = new No();
        Ac.Insert(4, no);
        Ac.Insert(1, no);
        Ac.Insert(2, no);
        Ac.Insert(8, no);
        Ac.Insert(0, no);
        Ac.Delete(1, no);
        System.out.println(Ac.ler(no));
    }
}

Na sua classe Action coloque o no como atributo e não variáveis de passagem no método.

public class Action {
   private No no;
   
    public Action(No no) {
       this.no = no;
    }

   public String Insert(int Value) {
      //implementação 
   }
   
   //Outros métodos
}

Dai sim vc consegue anular ele da maneira que deseja: no = null

Isto porque o java faz a passagem por copia nos métodos e não por referencia.

Seu metodo main ficará assim:


public static void main(String[] args)  
    {    
        No no = new No();  
        Action Ac = new Action(no);
        Ac.Insert(4);  
        Ac.Insert(1);  
        Ac.Insert(2);  
        Ac.Insert(8);  
        Ac.Insert(0);  
        Ac.Delete(1);  
        System.out.println(Ac.ler());  
    }  

[quote=luistiagos]Na sua classe Action coloque o no como atributo e não variáveis de passagem no método.

public class Action {
   private No no;
   
    public Action(No no) {
       this.no = no;
    }

   public String Insert(int Value) {
      //implementação 
   }
   
   //Outros métodos
}

Dai sim vc consegue anular ele da maneira que deseja: no = null

Isto porque o java faz a passagem por copia nos métodos e não por referencia.

Seu metodo main ficará assim:


public static void main(String[] args)  
    {    
        No no = new No();  
        Action Ac = new Action(no);
        Ac.Insert(4);  
        Ac.Insert(1);  
        Ac.Insert(2);  
        Ac.Insert(8);  
        Ac.Insert(0);  
        Ac.Delete(1);  
        System.out.println(Ac.ler());  
    }  

[/quote]

O metodo Delete tem um “sub nó” (no filho ou neto…) do nó que está em Action.
vou tentar pra ver se funciona.

Valeu!

Toma cuidado para não confundir. Arvore binária é uma coisa; árvore B, outra.

Opa!
É verdade!
Amigo regis_hideki , muito obrigado !
Lendo na wikipédia vi que são diferentes mesmo… e mais, a arvore B é mais vantajosa: