コード例 #1
0
        public void percursoAncestrais(int num) //mostra o percurso de um elemento até a raiz
        {
            no aux = raiz;

            while ((aux != null) && (aux.numero != num))
            {
                if (num > aux.numero)
                {
                    aux = aux.direita;
                }
                else
                {
                    aux = aux.esquerda;
                }
            }
            if (aux == null) //o elemento não existe na árvore
            {
                Console.WriteLine("Elemento não encontrado");
            }
            else if (num == raiz.numero) //o elemento é a própria raiz
            {
                Console.WriteLine("Não tem ancestral, o número informado é a própria raiz");
            }
            else
            {
                while (aux.pai != null)
                {
                    Console.WriteLine("Ancestral vale {0}", aux.pai.numero);
                    aux = aux.pai;
                }
            }
        }
コード例 #2
0
 public int maiorElemento(no n) //determina o maior elemento da árvore
 {
     if (n == null)             //retorna a raíz se não tiver filho a direita
     {
         return(raiz.numero);
     }
     else
     {
         if (n == raiz)
         {
             return(maiorElemento(n.direita));
         }
         else
         {
             if ((n.direita != null) && (n.numero > raiz.numero))
             {
                 return(maiorElemento(n.direita));
             }
             else
             {
                 return(n.numero);
             }
         }
     }
 }
コード例 #3
0
 public int menorElemento(no n) //determina o menor elemento da árvore
 {
     if (n == null)             //retorna a raíz se não tiver filho a esquerda
     {
         return(raiz.numero);
     }
     else
     {
         if (n == raiz)
         {
             return(menorElemento(n.esquerda));
         }
         else
         {
             if ((n.esquerda != null) && (n.numero > raiz.numero))
             {
                 return(menorElemento(n.esquerda));
             }
             else
             {
                 return(n.numero);
             }
         }
     }
 }
コード例 #4
0
 public void multiplicaElementos(int num, no n) //multipla os nós da árvore por um valor informado
 {
     if (n != null)
     {
         n.numero = n.numero * num;
         multiplicaElementos(num, n.esquerda);
         multiplicaElementos(num, n.direita);
     }
 }
コード例 #5
0
 public void exibirPosOrdem(no n) //exibe em pós ordem
 {
     if (n != null)
     {
         exibirPosOrdem(n.esquerda);
         exibirPosOrdem(n.direita);
         Console.WriteLine(n.numero);
     }
 }
コード例 #6
0
 public int somaElementos(no n) //soma os elementos da árvore
 {
     if (n == null)
     {
         return(0);
     }
     else
     {
         return(n.numero + somaElementos(n.esquerda) + somaElementos(n.direita));
     }
 }
コード例 #7
0
 public int contagemElementos(no n) //contar elementos da árvore
 {
     if (n == null)
     {
         return(0);
     }
     else
     {
         return(1 + contagemElementos(n.direita) + contagemElementos(n.esquerda));
     }
 }
コード例 #8
0
 public int quantosMaiores(int num, no n) //conta quantos nós são maiores que um número informado
 {
     if (n == null)
     {
         return(0);
     }
     else if (num < n.numero)
     {
         return(1 + quantosMaiores(num, n.esquerda) + quantosMaiores(num, n.direita));
     }
     else
     {
         return(quantosMaiores(num, n.esquerda) + quantosMaiores(num, n.direita));
     }
 }
コード例 #9
0
 public int nivel(int num, no n) //calcula em que nível um elemento está
 {
     if (num == n.numero)
     {
         return(1);
     }
     else if (num > n.numero)
     {
         return(1 + nivel(num, n.direita));
     }
     else
     {
         return(1 + nivel(num, n.esquerda));
     }
 }
コード例 #10
0
 public int contagemFolhas(no n) //conta quantos nós do tipo folha possuem na árvore
 {
     if (n == null)
     {
         return(0);
     }
     else if ((n.direita) == (n.esquerda))
     {
         return(1);
     }
     else
     {
         return(contagemFolhas(n.direita) + contagemFolhas(n.esquerda));
     }
 }
コード例 #11
0
        public void inserir(int num) //insere um elemento na árvore
        {
            no novo;
            no pai = null;
            no aux = raiz;

            if (existe(num, aux) == true) //verifica se o elemento já existe na árvore
            {
                Console.WriteLine("O elemento já existe");
            }
            else
            {
                while (aux != null)
                {
                    pai = aux;
                    if (num > aux.numero)
                    {
                        aux = aux.direita;
                    }
                    else
                    {
                        aux = aux.esquerda;
                    }
                }

                novo          = new no();
                novo.numero   = num;
                novo.esquerda = null;
                novo.direita  = null;
                novo.pai      = pai;

                if (raiz == null) //primeiro nó
                {
                    raiz = novo;
                }
                else if (num > pai.numero)
                {
                    pai.direita = novo;
                }
                else
                {
                    pai.esquerda = novo;
                }

                //Console.WriteLine("Elemento inserido");
            }
        }
コード例 #12
0
 public int altura(no n) //calcula a altura da árvore
 {
     if (n == null)
     {
         return(0);
     }
     else
     {
         if (altura(n.esquerda) > altura(n.direita))
         {
             return(altura(n.esquerda) + 1);
         }
         else
         {
             return(altura(n.direita) + 1);
         }
     }
 }
コード例 #13
0
 public bool existe(int num, no n) //verifica se um elemento existe na árvore
 {
     if (n == null)
     {
         return(false);
     }
     else if (n.numero == num)
     {
         return(true);
     }
     else if (n.numero > num)
     {
         return(existe(num, n.direita));
     }
     else
     {
         return(existe(num, n.esquerda));
     }
 }
コード例 #14
0
        public void remover(int num)  //remover um elemento da árvore
        {
            no aux = raiz;            //nó a ser removido
            no pai = null;            //pai do nó a ser removido
            no sub;                   //substituto do nó a ser removido
            no paiSub;                //pai do substituto do nó a ser removido

            while (aux.numero != num) //faz a busca pelo nó a ser removido
            {
                pai = aux;
                if (num > aux.numero)
                {
                    aux = aux.direita;
                }
                else
                {
                    aux = aux.esquerda;
                }
            }

            if (aux.esquerda == aux.direita) //nó que não tem filho (tipo folha)
            {
                if (aux == raiz)             //só tem um elemento
                {
                    raiz = null;
                }
                else if (num > pai.numero) //remove filho da direita
                {
                    pai.direita = null;
                }
                else
                {
                    pai.esquerda = null; //remove filho da esquerda
                }
            }

            else if (aux.direita == null) //só tem filho a esquerda
            {
                if (aux == raiz)          //só tem um filho
                {
                    raiz = aux.esquerda;
                }
                else if (num > pai.numero) //o nó a ser removido possui um filho maior
                {
                    pai.direita = aux.esquerda;
                }
                else //o nó a ser removido possui um filho menor
                {
                    pai.esquerda = aux.esquerda;
                }
            }

            else if (aux.esquerda == null) //só tem filho a direita
            {
                if (aux == raiz)           //só tem um filho
                {
                    raiz = aux.direita;
                }
                else if (num > pai.numero)
                {
                    pai.direita = aux.direita; //o nó a ser removido possui um filho maior
                }
                else //o nó a ser removido possui um filho menor
                {
                    pai.esquerda = aux.direita;
                }
            }

            else //nó substituto tem os dois filhos
            {
                sub    = aux.direita;
                paiSub = aux;

                while (sub.esquerda != null) //busca o nó substituto
                {
                    paiSub = aux;
                    sub    = sub.esquerda;
                }

                if (aux == raiz)       //nó removido é a raíz
                {
                    if (aux == paiSub) //nó substituto é o filho
                    {
                        sub.esquerda = aux.esquerda;
                        raiz         = sub;
                    }
                    else //nó substituto está em nível inferior
                    {
                        paiSub.esquerda = sub.direita;
                        sub.esquerda    = aux.esquerda;
                        sub.direita     = aux.direita;
                        raiz            = sub;
                    }
                }
                else //nó removido não é a raiz
                {
                    if (aux == paiSub) //nó substituto é o filho
                    {
                        sub.esquerda = aux.esquerda;
                        if (sub.numero > pai.numero)
                        {
                            pai.direita = sub;
                        }
                        else
                        {
                            pai.esquerda = sub;
                        }
                    }
                    else //nó substituto está em nível inferior
                    {
                        paiSub.esquerda = sub.direita;
                        sub.esquerda    = aux.esquerda;
                        sub.direita     = aux.direita;

                        if (sub.numero > pai.numero)
                        {
                            pai.direita = sub;
                        }
                        else
                        {
                            pai.esquerda = sub;
                        }
                    }
                }
            }
            Console.WriteLine("Elemento removido");
        }
コード例 #15
0
 public void esvaziar(no n) //esvazia a árvore
 {
     raiz = null;
 }