Você está aqui: JavaScript ::: Estruturas de Dados ::: Árvore Binária e Árvore Binária de Busca

Estruturas de dados em JavaScript - Como pesquisar um nó em uma árvore binária de busca usando um método recursivo em JavaScript

Quantidade de visualizações: 1463 vezes
Nesta dica mostrarei um exemplo completo de como pesquisar um valor em uma árvore binária de busca em JavaScript. Note que o exemplo usa apenas valores numéricos, mas você não terá dificuldades para modificar a classe Nó para os dados que você precisar.

Vamos começar com a classe No, ou seja, a classe que representa os nós da árvore binária e que contém o valor numérico e também as referências para os nós esquerdo e direito.

Código para No.js:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

// implementação da classe No
class No{
  // construtor do nó
  constructor(valor){
    this.valor = valor; // valor do nó  
    this.esquerdo = null; // filho esquerdo
    this.direito = null; // filho direito
  }
} 

Agora que já temos a classe No devidamente colocada em um arquivo .js separado, vamos criar a classe ArvoreBinariaBusca. Veja:

Código para ArvoreBinariaBusca.js:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

// implementação da classe ArvoreBinariaBusca
class ArvoreBinariaBusca{
  raiz = null; // referência para a raiz da árvore

  // método usado para inserir um novo nó na árvore
  // retorna true se o nó for inserido com sucesso e false
  // se o elemento
  // não puder ser inserido (no caso de já existir um 
  // elemento igual)
  inserir(valor){
   // a árvore ainda está vazia?
   if(this.raiz == null){
     // vamos criar o primeiro nó e definí-lo como 
     // a raiz da árvore
     this.raiz = new No(valor); // cria um novo nó 
   }
   else{
     // localiza o nó pai do novo nó
     var pai = null;
     var noAtual = this.raiz; // começa a busca pela raiz
 
     // enquanto o nó atual for diferente de null
     while(noAtual != null){
       // o valor sendo inserido é menor que o nó atual?
       if(valor < noAtual.valor) {
         pai = noAtual;
         // vamos inserir do lado esquerdo
         noAtual = noAtual.esquerdo;
       }
       // o valor sendo inserido é maior que o nó atual
       else if(valor > noAtual.valor){
         pai = noAtual;
         // vamos inserir do lado direito
         noAtual = noAtual.direito;
       }
       else{
         // um nó com este valor foi encontrado 
         return false;
       } 
     }
 
     // cria o novo nó e o adiciona como filho do nó pai
     if(valor < pai.valor){
       pai.esquerdo = new No(valor);
     }
     else{
       pai.direito = new No(valor);
     }
   }
 
   // retorna true para indicar que o novo nó foi inserido
   return true;
  }

  // método que permite pesquisar na árvore 
  // binária de busca
  pesquisar(valor){
    // chama a versão recursiva do método
    return this.pesquisarRec(this.raiz, valor);
  }

  // outra versão do método pesquisar que possui dois 
  // parâmetros (esta é a versão recursiva do método)
  pesquisarRec(noAtual, valor){
    // o valor pesquisado não foi encontrado. Vamos
    // retornar null
    if(noAtual == null){
      return null;
    } 
 
    // o valor pesquisado foi encontrado?
    if(valor == noAtual.valor){
      return noAtual; // retorna o nó atual 
    }

    // ainda não encontramos...vamos disparar uma nova 
    // chamada para a sub-árvore da esquerda
    else if(valor < noAtual.valor){
      return this.pesquisarRec(noAtual.esquerdo, valor);
    }

    // ainda não encontramos...vamos disparar uma nova 
    // chamada para a sub-árvore da direita
    else{
      return this.pesquisarRec(noAtual.direito, valor);
    }
  }
}
// fim classe Arvore

E finalmente o código para a página HTML que contém uma função JavaScript que permite testar a árvore binária de busca:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

<html>
<head>
  <title>Árvore Binária de Busca em JavaScript</title>
</head>
 
<body onload="testarArvore()">

<script type="text/javascript">
  function testarArvore(){
    // vamos criar um novo objeto da classe ArvoreBinariaBusca
    arvore = new ArvoreBinariaBusca();
  
    // vamos inserir 5 valores na árvore
    arvore.inserir(8);
    arvore.inserir(43);
    arvore.inserir(2);
    arvore.inserir(18);
    arvore.inserir(71);
  
    var valorPesquisa = 18;
    // obtém um objeto da classe NoArvore a partir do 
    // método pesquisar() da classe ArvoreBinariaBusca
    var res = arvore.pesquisar(valorPesquisa);
    // o valor foi encontrado?
    if(res != null){
      document.writeln("O valor foi encontrado na árvore");
    }
    else{
      document.writeln("O valor não foi encontrado na árvore");  
    }
  }
</script>

<!-- faz o import das classes No e ArvoreBinariaBusca //-->
<script src="No.js"></script>
<script src="ArvoreBinariaBusca.js"></script>

</body>
</html>


Link para compartilhar na Internet ou com seus amigos:

JavaScript ::: Dicas & Truques ::: Arrays e Matrix (Vetores e Matrizes)

Como retornar o índice da primeira ocorrência de um elemento em um array do JavaScript usando a função indexOf()

Quantidade de visualizações: 2282 vezes
Em algumas ocasiões nós precisamos obter e retornar o índice da primeira ocorrência de um determinado elemento em um array JavaScript. Para isso podemos usar a funções indexOf(). Se o elemento não puder ser encontrado, o valor -1 é retornado.

Veja um exemplo de seu uso:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

<script type="text/javascript">
  var valores = new Array(1, 2, 3, 2, 2, 4, 5);
  // vamos obter o índice da primeira ocorrência
  // do elemento com o valor 2
  var indice = valores.indexOf(2);
  window.alert("Elemento encontrado no índice: " 
    + indice);
</script>

Execute o código e veja que o elemento foi encontrado no índice 1, ou seja, na segunda posição do array, já que os índices de vetor e matriz em JavaScript começam a partir de 0.

Experimente pesquisar o valor 50 e verá que o valor retornado é -1, indicando que o elemento não foi encontrado.


JavaScript ::: Dicas & Truques ::: Arrays e Matrix (Vetores e Matrizes)

Como testar se todos os elementos de um array satisfazem uma condição em JavaScript usando a função every()

Quantidade de visualizações: 1401 vezes
Em algumas situações nós gostaríamos de testar todos os elementos de um vetor e verificar se todos eles passam em um determinado teste. Para isso podemos usar a função every(), adicionada à linguagem JavaScript por meio do ECMAScript 5 (JavaScript 5, ECMAScript 2009, ES5).

Este método nos permite fornecer uma função de callback que será chamada para cada um dos elementos do vetor. E o retorno do método every() é um valor true se todos os elementos passarem no teste e false em caso contrário.

Veja um exemplo no qual testamos se TODOS os elementos de um vetor são maiores que 10:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

<script type="text/javascript">
  function testarTodos(valor, indice, vetor){
    if(valor > 10){
      return true;
    }
  }  

  var valores = new Array(21, 50, 30, 70, 12, 3);
  // vamos verificar se TODOS os valores são
  // maiores que 10
  var res = valores.every(testarTodos);  
  window.alert("Todos passaram no teste: " + res);
</script>

Aqui o resultado será false, pois o valor 3 não passou no teste. É importante observar que, assim que a função de callback retorna false pela primeira vez, o método every() já abandona sua execução.

Uma função passada para o método every() pode conter os seguintes argumentos (nessa mesma ordem):

a) O valor do item;
b) O índice do item (opcional);
c) O vetor a partir do qual o método every() está sendo chamado (opcional).

Como última observação, o método every() não modifica o array original.


JavaScript ::: Dicas & Truques ::: Data e Hora

Como retornar a hora em JavaScript usando a função getHours() do objeto Date

Quantidade de visualizações: 7024 vezes
Em várias situações nós precisamos obter as horas a partir de um objeto Date do JavaScript. Para isso nós podemos efetuar uma chamada à sua função getHours(), que retorna um valor que vai de 0 até 23.

Veja o código completo para o exemplo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

<html>
<head>
<title>Estudando JavaScript</title>
</head>
<body>

<script type="text/javascript">
  var data = new Date();
  var hora = data.getHours();
  document.write("O valor da hora é: " + hora);
</script>
 
</body>
</html>

Ao executar este código JavaScript nós teremos o seguinte resultado:

O valor da hora é: 14


Vamos testar seus conhecimentos em Python

A coleção Set da linguagem Python permite itens repetidos.

A) Verdadeiro

B) Falso
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em Ética e Legislação Profissional

Responsabilidade civil no código de defesa do consumidor

Um consumidor compra um ferro de passar roupa e quando está manejando o ferro pela primeira vez ele explode e o atinge, causando-lhe danos morais e estéticos. O consumidor é levado ao hospital para tratar alguns ferimentos. Nesse caso, a ação indenizatória deverá ser proposta em face do fabricante no prazo de:

A) prazo decadencial de 5 anos.

B) prazo prescricional de 30 dias.

C) prazo decadencial de 90 dias.

D) prazo prescricional de 5 anos.

E) prazo prescricional de 90 dias.
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em Fundações

Sondagem à Percussão (SPT) e Rotativa (RQD)

Identifique a qualidade do maciço através do RQD de uma porção da rocha cuja manobra na sondagem rotativa foi de 1,5m e recuperou-se os seguintes fragmentos: 12cm + 16cm + 7cm + 35cm + 6cm + 14cm + 8cm + 2cm + 50cm.

A) Trata-se de um maciço muito fraco. RQD menor que 25%.

B) Trata-se de um maciço fraco, com RQD entre 25 e 50%.

C) Trata-se de um maciço regular, com RQD entre 50 e 75%.

D) Trata-se de um maciço bom, com RQD entre 75 e 90%.

E) Trata-se de um maciço excelente, RQD=100%.
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em Fundações

Fundações diretas: tipos, características, métodos construtivos e cálculo das tensões no solo

Um engenheiro verificou um problema de projeto na planta em uma edificação de grande porte: os pilares estavam muito próximos entre si. Desta forma, ele precisaria indicar ao mestre de obra um tipo de fundação mais apropriado, para não acarretar um problema estrutural devido à aproximidade dos pilares. A partir desta informação, assinale a alternativa correta:

A) Radier.

B) Sapata associada.

C) Bloco.

D) Sapata de divisa.

E) Sapata corrida.
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em Topografia

Rumo e azimute

Prova de Engenharia Civil Prefeitura de Jarú

O azimute correspondente ao rumo 32º 20' 30'' é:

A) 212º 20' 30''

B) 147º 39' 30''

C) 327º 39' 30''

D) 302º 20' 30''

E) 58º 40' 30''
Verificar Resposta Estudar Cards Todas as Questões

Desafios, Exercícios e Algoritmos Resolvidos de JavaScript

Veja mais Dicas e truques de JavaScript

Dicas e truques de outras linguagens

Códigos Fonte

Programa de Gestão Financeira Controle de Contas a Pagar e a Receber com Cadastro de Clientes e FornecedoresSoftware de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento
Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidadesControle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades
Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: Delphi
6º lugar: C
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2024 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 37 usuários muito felizes estudando em nosso site.