Beispiel #1
0
 /// Método recursivo responsável por adicionar um aluno à árvore.
 /// Parâmetro "raizArvore": raiz da árvore ou sub-árvore em que o aluno será adicionado.
 /// Parâmetro "alunoNovo": aluno que deverá ser adicionado à árvore.
 /// Retorna a raiz atualizada da árvore ou sub-árvore em que o aluno foi adicionado.
 private NodoAluno adicionar(NodoAluno raizArvore, Aluno alunoNovo)
 {
     /// Se a raiz da árvore ou sub-árvore for null, a árvore está vazia e então um novo aluno é inserido.
     if (raizArvore == null)
     {
         raizArvore = new NodoAluno(alunoNovo);
     }
     else
     {
         /// Se o número de matrícula do aluno armazenado na raiz da árvore for maior do que o número de matrícula do aluno que deverá ser inserido na árvore:
         /// adicione esse aluno à sub-árvore esquerda; e atualize a referência para a sub-árvore esquerda modificada.
         if (raizArvore.item.getNumMatricula() > alunoNovo.getNumMatricula())
         {
             raizArvore.esquerda = adicionar(raizArvore.esquerda, alunoNovo);
         }
         else
         {
             /// Se o número de matrícula do aluno armazenado na raiz da árvore for menor do que o número de matrícula do aluno que deverá ser inserido na árvore:
             /// adicione esse aluno à sub-árvore direita; e atualize a referência para a sub-árvore direita modificada.
             if (raizArvore.item.getNumMatricula() < alunoNovo.getNumMatricula())
             {
                 raizArvore.direita = adicionar(raizArvore.direita, alunoNovo);
             }
             else
             {
                 /// O número de matrícula do aluno armazenado na raiz da árvore é igual ao número de matrícula do aluno que deveria ser inserido na árvore.
                 Console.WriteLine("O aluno " + alunoNovo.getNome() + ", cuja matrícula é " + alunoNovo.getNumMatricula() + ", já foi inserido anteriormente na árvore.");
             }
         }
     }
     /// Retorna a raiz atualizada da árvore ou sub-árvore em que o aluno foi adicionado.
     return(raizArvore);
 }
Beispiel #2
0
 /// Metodo que encapsula a adição recursiva de alunos à árvore.
 /// Parâmetro "alunoNovo": aluno que deverá ser inserido na árvore.
 public void inserir(Aluno alunoNovo)
 {
     /// Chama o método recursivo "adicionar", que será responsável por adicionar, o aluno passado como parâmetro, à árvore.
     /// O método "adicionar" receberá, como primeiro parâmetro, a raiz atual da árvore; e, como segundo parâmetro, o aluno que deverá ser adicionado à árvore.
     /// Por fim, a raiz atual da árvore é atualizada, com a raiz retornada pelo método "adicionar".
     this.raiz = adicionar(this.raiz, alunoNovo);
 }
Beispiel #3
0
        public void imprimirEmOrdem()
        {
            NodoAluno nodo = raiz;

            imprimirMenorMaior(nodo);
            Console.WriteLine();
        }
Beispiel #4
0
        //Questão 4

        private int contarNumAlunos(NodoAluno node)
        {
            if (node == null)
            {
                return(0);
            }

            return(1 + contarNumAlunos(node.esquerda) + contarNumAlunos(node.direita));
        }
Beispiel #5
0
        // Questão 3
        private void imprimirMenorMaior(NodoAluno raizArvore)   // base case
        {
            if (raizArvore == null)
            {
                return;
            }

            imprimirMenorMaior(raizArvore.esquerda);
            Console.Write(raizArvore.item.getNumMatricula() + "\t");
            imprimirMenorMaior(raizArvore.direita);
        }
Beispiel #6
0
        public int numAlunos()
        {
            NodoAluno nodoAluno = raiz;

            if (nodoAluno == null)
            {
                return(0);
            }
            else
            {
                int numAlunos = contarNumAlunos(nodoAluno);
                return(numAlunos);
            }
        }
Beispiel #7
0
        public Aluno menorNumeroMatricula()
        {
            NodoAluno nodo = raiz;

            if (nodo == null)
            {
                return(null);
            }
            Aluno menor = nodo.item;

            buscaMenorMatricula(nodo, ref menor);

            return(menor);
        }
Beispiel #8
0
        // Questão 1
        public void buscaMenorMatricula(NodoAluno nodo, ref Aluno menor)   // base case
        {
            if (nodo == null)
            {
                return;
            }

            if (nodo.esquerda == null && nodo.direita == null)
            {
                if (menor.getNumMatricula() > nodo.item.getNumMatricula())
                {
                    menor = nodo.item;
                    return;
                }
            }

            buscaMenorMatricula(nodo.esquerda, ref menor);
            buscaMenorMatricula(nodo.direita, ref menor);
        }
Beispiel #9
0
 /// Método recursivo responsável por localizar na árvore ou sub-árvore o antecessor do nó que deverá ser retirado.
 /// O antecessor do nó que deverá ser retirado da árvore corresponde
 /// ao nó que armazena os dados do aluno cujo número de matrícula é o maior,
 /// dentre os números de matrícula menores do que o número de matrícula do nó que deverá ser retirado.
 /// Depois de ser localizado na árvore ou sub-árvore,
 /// o antecessor do nó que deverá ser retirado da árvore o substitui.
 /// Adicionalmente, a árvore ou sub-árvore é atualizada com a remoção do antecessor.
 /// Parâmetro "alunoRetirar": referência ao nó que armazena o aluno que deverá ser retirado da árvore.
 /// Parâmetro "raizArvore": raiz da árvore ou sub-árvore em que o antecessor do nó que deverá ser retirado deverá ser localizado.
 /// Retorna: raiz atualizada da árvore ou sub-árvore após a remoção do antecessor do nó que foi retirado da árvore.
 private NodoAluno antecessor(NodoAluno alunoRetirar, NodoAluno raizArvore)
 {
     /// Se o antecessor do nó que deverá ser retirado da árvore ainda não foi encontrado...
     if (raizArvore.direita != null)
     {
         /// Pesquise o antecessor na sub-árvore direita.
         raizArvore.direita = antecessor(alunoRetirar, raizArvore.direita);
         return(raizArvore);
     }
     /// O antecessor do nó que deverá ser retirado da árvore foi encontrado.
     else
     {
         /// O antecessor do nó que deverá ser retirado da árvore foi localizado e deverá substitui-lo.
         alunoRetirar.item.setNumMatricula(raizArvore.item.getNumMatricula());
         alunoRetirar.item.setNome(raizArvore.item.getNome());
         alunoRetirar.item.setNota(raizArvore.item.getNota());
         /// A raiz da árvore ou sub-árvore é atualizada com os descendentes à esquerda do antecessor.
         /// Ou seja, retira-se o antecessor da árvore.
         return(raizArvore.esquerda);
     }
 }
Beispiel #10
0
        //Questão 2
        private NodoAluno pesquisar(NodoAluno raizArvore, int matricula)
        {
            if (raizArvore == null)
            {
                return(null);
            }

            if (raizArvore.item.getNumMatricula() == matricula)
            {
                return(raizArvore);
            }

            if (raizArvore.item.getNumMatricula() > matricula)
            {
                return(pesquisar(raizArvore.esquerda, matricula));
            }
            else
            {
                return(pesquisar(raizArvore.direita, matricula));
            }
        }
Beispiel #11
0
        public Aluno buscar(int matricula)
        {
            NodoAluno nodoAluno = raiz;

            if (nodoAluno == null)
            {
                return(null);
            }
            else
            {
                NodoAluno aluno = pesquisar(nodoAluno, matricula);

                if (aluno == null)
                {
                    return(null);
                }
                else
                {
                    return(aluno.item);
                }
            }
        }
Beispiel #12
0
        public NodoAluno esquerda;   // referência ao nodo armazenado, na árvore, à esquerda do aluno em questão.

        public NodoAluno(Aluno registro)
        {
            item     = registro;
            direita  = null;
            esquerda = null;
        }
Beispiel #13
0
 /// Método que encapsula a retirada recursiva de um aluno da árvore.
 /// Parâmetro "matriculaRemover": número de matrícula do aluno que deverá ser localizado e removido da árvore.
 public void remover(int matriculaRemover)
 {
     /// Chama o método recursivo "retirar", que será responsável por pesquisar o aluno, cujo número de matrícula foi passado como parâmetro, na árvore e retirá-lo da árvore.
     /// O método "retirar" receberá, como primeiro parâmetro, a raiz atual da árvore; e, como segundo parâmetro, o número de matrícula do aluno que deverá ser localizado e retirado dessa árvore.
     this.raiz = retirar(this.raiz, matriculaRemover);
 }
Beispiel #14
0
        private NodoAluno raiz; // referência à raiz da árvore.

        /// Construtor da classe.
        /// Esse construtor cria uma nova árvore binária de alunos vazia. Para isso, esse método atribui null à raiz da árvore.
        public ABBAluno()
        {
            raiz = null;
        }
Beispiel #15
0
 /// Método recursivo responsável por localizar um aluno na árvore e retirá-lo da árvore.
 /// Parâmetro "raizArvore": raiz da árvore ou sub-árvore da qual o aluno será retirado.
 /// Parâmetro "matricula": número de matrícula do aluno que deverá ser localizado e removido da árvore.
 /// Retorna a raiz atualizada da árvore ou sub-árvore da qual o aluno foi retirado; ou null, caso não tenha sido localizado aluno com o número de matrícula informado.
 private NodoAluno retirar(NodoAluno raizArvore, int matricula)
 {
     /// Se a raiz da árvore ou sub-árvore for null, a árvore está vazia e o aluno, que deveria ser retirado dessa árvore, não foi encontrado.
     /// Nesse caso, deve-se retornar null.
     if (raizArvore == null)
     {
         Console.WriteLine("O aluno, cuja matrícula é " + matricula + ", não foi encontrado.");
         return(raizArvore);
     }
     else
     {
         /// O número de matrícula do aluno armazenado na raiz da árvore é igual ao número de matrícula do aluno que deve ser retirado dessa árvore.
         /// Ou seja, o aluno que deve ser retirado da árvore foi encontrado.
         if (raizArvore.item.getNumMatricula() == matricula)
         {
             /// O nó da árvore que será retirado não possui descendentes à direita.
             /// Nesse caso, os descendentes à esquerda do nó que está sendo retirado da árvore passarão a ser descendentes do nó-pai do nó que está sendo retirado.
             if (raizArvore.direita == null)
             {
                 return(raizArvore.esquerda);
             }
             else
             /// O nó da árvore que será retirado não possui descendentes à esquerda.
             /// Nesse caso, os descendentes à direita do nó que está sendo retirado da árvore passarão a ser descendentes do nó-pai do nó que está sendo retirado.
             if (raizArvore.esquerda == null)
             {
                 return(raizArvore.direita);
             }
             else
             {
                 /// O nó que está sendo retirado da árvore possui descendentes à esquerda e à direita.
                 /// Nesse caso, o antecessor do nó que está sendo retirado é localizado na sub-árvore esquerda desse nó.
                 /// O antecessor do nó que está sendo retirado da árvore corresponde
                 /// ao nó que armazena o aluno cujo número de matrícula é o maior,
                 /// dentre os números de matrícula menores do que o número de matrícula do nó que está sendo retirado.
                 /// Depois de ser localizado na sub-árvore esquerda do nó que está sendo retirado,
                 /// o antecessor desse nó o substitui.
                 /// A sub-árvore esquerda do nó que foi retirado é atualizada com a remoção do antecessor.
                 raizArvore.esquerda = antecessor(raizArvore, raizArvore.esquerda);
                 /// Retorna a raiz atualizada da árvore ou sub-árvore da qual o aluno foi retirado.
                 return(raizArvore);
             }
         }
         else
         {
             /// Se o número de matrícula do aluno armazenado na raiz da árvore for maior do que o número de matrícula do aluno que deverá ser localizado e retirado da árvore:
             /// pesquise e retire esse aluno da sub-árvore esquerda.
             if (raizArvore.item.getNumMatricula() > matricula)
             {
                 raizArvore.esquerda = retirar(raizArvore.esquerda, matricula);
             }
             else
             {
                 /// Se o número de matrícula do aluno armazenado na raiz da árvore for menor do que o número de matrícula do aluno que deverá ser localizado e retirado da árvore:
                 /// pesquise e retire esse aluno da sub-árvore direita.
                 raizArvore.direita = retirar(raizArvore.direita, matricula);
             }
             /// Retorna a raiz atualizada da árvore ou sub-árvore da qual o aluno foi retirado.
             return(raizArvore);
         }
     }
 }