Lista de Exercícios Resolvidos: Java | Python | VisuAlg | Portugol | C | C# | VB.NET | C++
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: 1347 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:

// 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:

// 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:

<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:
Anúncio Patrocinado
Chat de Sexo - Site para adultso - Maiores de 18 anos. Converse com pessoas de todo o Brasil, de forma discreta e anônima

Java ::: Dicas & Truques ::: Strings e Caracteres

Como transformar um StringBuffer em uma String usando o método toString() da classe StringBuffer

Quantidade de visualizações: 11371 vezes
Como já vimos em dicas anteriores, um objeto da classe String é imutável, ou seja, quando modificamos o conteúdo de uma String, o interpretador cria um novo objeto, copiando o conteúdo da string anterior para o objeto recém-criado. Já a classe StringBuffer é mutável, ou seja, podemos modificar o seu conteúdo sem a necessidade da criação de um novo objeto.

Você ficará surpreso ao saber que não podemos atribuir uma variável do tipo StringBuffer em uma variável do tipo String e vice-versa. Ao tentarmos fazer isso, os seguintes erros de compilação são exibidos:

a) error: incompatible types: StringBuffer cannot be converted to String
b) error: incompatible types: String cannot be converted to StringBuffer

Assim, sempre que for necessário converter um StringBuffer em uma String, temos que usar o seu método toString(). Veja:

package arquivodecodigos;

// Este exemplo mostra como converter um
// StringBuffer em uma String

public class Estudos{
  public static void main(String[] args){
    StringBuffer frase = new StringBuffer("Programação Java");
    String resultado = frase.toString(); 
    System.out.println(resultado);
    
    System.exit(0);
  }
} 



C# ::: Dicas & Truques ::: Arquivos e Diretórios

Apostila C# para iniciantes - Como listar todos os arquivos de um diretório usando C#

Quantidade de visualizações: 28604 vezes
Nesta dica eu mostro como é possível usar o método GetFiles() da classe Directory para listar todos os arquivos de um determinado diretório. Note como usei o caractere "*" para informar o padrão de arquivos a serem exibidos.

Veja o código completo:

using System;
using System.IO;

namespace Estudos{
  class Program{
    static void Main(string[] args) {
      string diretorio = @"C:\estudos_dart";
      string padrao = "*";

      if (args.Length > 0) {
        diretorio = args[0];
      }
      if (args.Length > 1) {
        padrao = args[1];
      }

      string[] arquivos = Directory.GetFiles(diretorio,
        padrao);

      foreach (string arquivo in arquivos) {
        Console.WriteLine(arquivo);
      }
    }
  }
}

Ao executar este código nós teremos uma saída parecida com:

C:\estudos_dart\condicional_if_else.dart
C:\estudos_dart\DICA.txt
C:\estudos_dart\laco_do_while.dart
C:\estudos_dart\laco_for.dart
C:\estudos_dart\laco_while.dart
C:\estudos_dart\primeira.dart


CSS ::: Dicas & Truques ::: Cores de Fundo e Imagens de Fundo

Exemplos de uso da propriedade background do CSS para definições cores e imagens de fundo em elementos HTML

Quantidade de visualizações: 8750 vezes
Nesta dica mostrarei alguns exemplos muito úteis da propriedade background do CSS para definirmos cores e imagens de fundo para a página HTML e também para os elementos HTML:

Exemplo 1: Como definir a cor de fundo para a página HTML usando a propriedade background:

body {background: #0099CC}

Exemplo 2: Como definir a cor de fundo e a imagem de fundo para a página HTML usando as propriedades background e url:

body {background: #0099CC url(fundo.gif)}

Exemplo 3: Como definir a cor de fundo, a imagem de fundo para a página HTML e a forma de repetição usando as propriedade background, url e repeat-x:

body {background: #0099CC url(fundo.gif) 
      repeat-x}

Exemplo 4: Como definir a cor de fundo, a imagem de fundo para a página HTML, a forma de repetição e como fixar a imagem de fundo usando as propriedade background, url, repeat-x e fixed:

body {background: #0099CC url(fundo.gif) repeat-x 
      fixed}

Exemplo 5: Como definir a cor de fundo, a imagem de fundo para a página HTML, sem repetição, fixa e posições inicias usando as propriedade background, url, repeat-x e fixed:

body {background: #0099CC url(fundo.gif) no-repeat 
      fixed 40 60}



Java ::: Dicas & Truques ::: Fuso Horários

Como retornar uma lista de todos os IDs de fusos horários suportados pela linguagem Java usando o método getAvailableIDs() da classe TimeZone

Quantidade de visualizações: 8716 vezes
A linguagem Java, por meio da classe TimeZone, nos permite trabalhar com uma enorme variedade de fusos horários. No entanto, antes de assumir que um determinado fuso horário é suportado, é interessante verificar se tal fuso horário está na lista de IDs suportados. Isso pode ser feito com uma chamada ao método estático getAvailableIDs(). Este método retorna o ID de todos os fusos horários suportados. Veja um exemplo de como usá-lo:

import java.util.*;

public class Estudos{ 
  public static void main(String args[]){ 
    // obtém todos os IDs de fusos horários 
    // disponíveis na classe TimeZone
    String fusos[] = TimeZone.getAvailableIDs();

    for(int i = 0; i < fusos.length; i++){
      System.out.println(fusos[i]);
    } 
  } 
}

Ao executar este código você terá um resultado semelhante à (optamos por listar apenas os 100 primeiros resultados):

Etc/GMT+12
Etc/GMT+11
MIT
Pacific/Apia
Pacific/Midway
Pacific/Niue
Pacific/Pago_Pago
Pacific/Samoa
US/Samoa
America/Adak
America/Atka
Etc/GMT+10
HST
Pacific/Fakaofo
Pacific/Honolulu
Pacific/Johnston
Pacific/Rarotonga
Pacific/Tahiti
SystemV/HST10
US/Aleutian
US/Hawaii
Pacific/Marquesas
AST
America/Anchorage
America/Juneau
America/Nome
America/Yakutat
Etc/GMT+9
Pacific/Gambier
SystemV/YST9
SystemV/YST9YDT
US/Alaska
America/Dawson
America/Ensenada
America/Los_Angeles
America/Tijuana
America/Vancouver
America/Whitehorse
Canada/Pacific
Canada/Yukon
Etc/GMT+8
Mexico/BajaNorte
PST
PST8PDT
Pacific/Pitcairn
SystemV/PST8
SystemV/PST8PDT
US/Pacific
US/Pacific-New
America/Boise
America/Cambridge_Bay
America/Chihuahua
America/Dawson_Creek
America/Denver
America/Edmonton
America/Hermosillo
America/Inuvik
America/Mazatlan
America/Phoenix
America/Shiprock
America/Yellowknife
Canada/Mountain
Etc/GMT+7
MST
MST7MDT
Mexico/BajaSur
Navajo
PNT
SystemV/MST7
SystemV/MST7MDT
US/Arizona
US/Mountain
America/Belize
America/Cancun
America/Chicago
America/Costa_Rica
America/El_Salvador
America/Guatemala
America/Indiana/Knox
America/Indiana/Petersburg
America/Indiana/Vincennes
America/Knox_IN
America/Managua
America/Menominee
America/Merida
America/Mexico_City
America/Monterrey
America/North_Dakota/Center
America/North_Dakota/New_Salem
America/Rainy_River
America/Rankin_Inlet
America/Regina
America/Swift_Current
America/Tegucigalpa
America/Winnipeg
CST
CST6CDT
Canada/Central
Canada/East-Saskatchewan
Canada/Saskatchewan
Chile/EasterIsland

Um bom uso deste método é quando estamos desenvolvendo uma aplicação que mostra o horário ao redor do mundo. Podemos ter uma lista de fusos horários e, mediante a seleção do usuário, fornecer o valor selecionado para o método setTimeZone() da classe Calendar, por exemplo.


C ::: Fundamentos da Linguagem ::: Métodos, Procedimentos e Funções

Apostila C para iniciantes - Como escrever suas próprias funções em C

Quantidade de visualizações: 10644 vezes
As funções na linguagem C têm por objetivo dividir nossos programas em partes menores. Em vez de colocar todo o nosso código na função main() nós podemos criar nossas próprias funções e, desta forma, agrupar funcionalidades relacionadas.

Suponha que estejamos desenvolvendo um editor de texto em C. Poderíamos então ter funções que abrem o arquivo a ser exibido no editor, que salvam o arquivo, que verificam se houve alterações no texto, etc. E a maior vantagem disso é que conseguimos promover o reaproveitamento de código, uma vez que, diferente da função main(), as funções disponíveis na linguagem e aquelas que nós mesmos criamos podem ser chamadas mais de uma vez durante a execução do programa.

Então, já sabemos que uma função não é nada mais que um bloco de códigos situado fora da função main() e que pode ser chamado a partir da função main() ou de outras funções no programa. Sendo assim, vamos escrever nossa primeira função em C. Veja o código a seguir:

#include <stdio.h>
#include <stdlib.h>

// uma função que escreve uma frase
// na tela
void escrever(void){
  printf("Sou uma funcao");
}

int main(int argc, char *argv[]){
  // efetua uma chamada à função escrever
  escrever();

  puts("\n\n");
  system("PAUSE");
  return 0;
}

Neste programa nós temos uma função chamada escrever() que apenas escreve uma frase na tela. Note o uso de void para indicar que a função não retorna nada e não aceita nenhum argumento. Alguns compiladores (tais como Dev-C++) não exigem que coloquemos void para indicar a ausência de parâmetros na função. Assim, a função acima pode ser reescrita da seguinte forma:

void escrever(){
  printf("Sou uma funcao");
}

Importante notar que, dentro do corpo de uma função, podemos inserir a quantidade de código que desejarmos. Isso é importante, uma vez que a tarefa realizada por uma função pode não ser tão simples quanto o exemplo que usamos até este ponto. Veja um programa que contém uma função personalizada mais elaborada. Note as duas chamadas a esta função a partir da função main():

#include <stdio.h>
#include <stdlib.h>

// uma função que escreve uma frase
// na tela
void escrever(){
  char nome[] = "Osmar J. Silva";
  printf("Ola, meu nome e %s\n", nome);
}

int main(int argc, char *argv[]){
  printf("Sou main. Vou chamar a funcao escrever()\n");

  // efetua uma chamada à função escrever
  escrever();

  // efetua outra chamada à função escrever
  escrever();

  printf("Acabei de efetuar chamadas a funcao escrever()");

  puts("\n\n");
  system("PAUSE");
  return 0;
}

Funções podem receber argumentos e retornar valores. E quando isso acontece nós estamos realmente escrevendo funções úteis. Quando perceber que já aprendeu a escrever funções simples como as demonstradas nesta dica, volte sua atenção para as funções mais elaboradas que tratamos em outras dicas relacionadas.


Desafios, Exercícios e Algoritmos Resolvidos de C

Veja mais Dicas e truques de C

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

Anúncio Patrocinado
Chat de Sexo - Site para adultso - Maiores de 18 anos. Converse com pessoas de todo o Brasil, de forma discreta e anônima


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