Java ::: Estruturas de Dados ::: Árvore Binária e Árvore Binária de Busca

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

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

Código para No.java:

package arvore_binaria;

public class No {
  private int valor; // valor armazenado no nó
  private No esquerdo; // filho esquerdo
  private No direito; // filho direito
 
  // construtor do nó
  public No(int valor){
    this.valor = valor;
    this.esquerdo = null;
    this.direito = null;
  }

  public int getValor() {
    return valor;
  }

  public void setValor(int valor) {
    this.valor = valor;
  }

  public No getEsquerdo() {
    return esquerdo;
  }

  public void setEsquerdo(No esquerdo) {
    this.esquerdo = esquerdo;
  }

  public No getDireito() {
    return direito;
  }

  public void setDireito(No direito) {
    this.direito = direito;
  }
}

Código para ArvoreBinariaBusca.java:

package arvore_binaria;

public class ArvoreBinariaBusca {
  private No raiz; // 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)
  public boolean inserir(int valor){
    // a árvore ainda está vazia?
    if(raiz == null){
      // vamos criar o primeiro nó e definí-lo como a raiz da árvore
      raiz = new No(valor); // cria um novo nó
    }
    else{
      // localiza o nó pai do novo nó
      No pai = null;
      No noAtual = 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.getValor()) {
          pai = noAtual;
          // vamos inserir do lado esquerdo
          noAtual = noAtual.getEsquerdo();
        }
        // o valor sendo inserido é maior que o nó atual
        else if(valor > noAtual.getValor()){
          pai = noAtual;
          // vamos inserir do lado direito
          noAtual = noAtual.getDireito();
        }
        else{
          return false; // um nó com este valor foi encontrado
        }
      }
        
      // cria o novo nó e o adiciona como filho do nó pai
      if(valor < pai.getValor()){
         pai.setEsquerdo(new No(valor));
      }
      else{
        pai.setDireito(new No(valor));
      }
    }
 
    return true; // retorna true para indicar que o novo nó foi inserido
  }
   
  // método que permite pesquisar na árvore binária de busca
  public No pesquisar(int valor){
    return pesquisar(raiz, valor); // chama a versão recursiva do método
  }
 
  // sobrecarga do método pesquisar que recebe dois 
  // parâmetros (esta é a versão recursiva do método)
  private No pesquisar(No noAtual, int valor){
    // o valor pesquisado não foi encontrado....vamos retornar null
    if(noAtual == null){
      return null;
    }
  
    // o valor pesquisado foi encontrado?
    if(valor == noAtual.getValor()){
      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.getValor()){
      return pesquisar(noAtual.getEsquerdo(), valor);
    }
    // ainda não encontramos...vamos disparar uma nova 
    // chamada para a sub-árvore da direita
    else{
      return pesquisar(noAtual.getDireito(), valor);
    }
  }
}

E finalmente o código para a classe principal:

package arvore_binaria;

import java.util.Scanner;

public class ArvoreBinariaTeste {
  public static void main(String[] args) {
    Scanner entrada = new Scanner(System.in);  
       
    // vamos criar um novo objeto da classe ArvoreBinariaBusca
    ArvoreBinariaBusca arvore = new ArvoreBinariaBusca();
    
    // vamos inserir 5 valores na árvore
    for(int i = 0; i < 5; i++){
      System.out.print("Informe um valor inteiro: ");
      int valor = Integer.parseInt(entrada.nextLine());
       
      // vamos inserir o nó e verificar o sucesso da operação
      if(!arvore.inserir(valor)){
        System.out.println("Não foi possível inserir." +
          " Um elemento já contém este valor.");  
      }
    }
     
    // vamos pesquisar um valor na árvore
    System.out.print("\nInforme o valor a ser pesquisado: ");
    int valorPesquisa = Integer.parseInt(entrada.nextLine());
    // obtém um objeto da classe NoArvore a partir do 
    // método pesquisar() da classe ArvoreBinariaBusca
    No res = arvore.pesquisar(valorPesquisa);
    // o valor foi encontrado?
    if(res != null){
      System.out.println("O valor foi encontrado na árvore");
    }
    else{
      System.out.println("O valor não foi encontrado na árvore");  
    }
     
    System.out.println("\n");
  }
}



AutoCAD VBA ::: Dicas & Truques ::: Comprimentos, distâncias e ângulos

Como calcular a distância entre dois pontos no AutoCAD usando AutoCAD VBA

Quantidade de visualizações: 349 vezes
Em várias situações nós precisamos calcular e retornar a distância entre dois pontos na área de desenho do AutoCAD. Esta tarefa pode ser facilmente realizada com o uso da linguagem AutoCAD VBA.

Neste exemplo nós usaremos a função ThisDrawing.Utility.GetPoint() para pedir para o usuário selecionar dois pontos na área de desenho e em seguida vamos mostrar a distância entre eles.

Veja o código AutoCAD VBA completo para o exemplo:

' Esta macro AutoCAD VBA demonstra como podemos
' calcular a distância entre dois pontos na área de
' desenho do AutoCAD
Sub DistanciaDoisPontos()
  ' vamos declarar os dois pontos geométricos
  Dim p As Variant
  Dim q As Variant
  ' para guardar as coordenadas temporárias
  Dim x As Double, y As Double, z As Double
  ' para guardar a distância
  Dim distancia As Double

  ' vamos pedir para o usuário informar os dois pontos
  p = ThisDrawing.Utility.GetPoint(, vbCrLf & _
    "Indique o primeiro ponto: ")
  q = ThisDrawing.Utility.GetPoint(p, vbCrLf & _
    "Indique o segundo ponto: ")

  ' agora calculamos a distância entre os dois pontos informados
  x = p(0) - q(0)
  y = p(1) - q(1)
  z = p(2) - q(2)
  distancia = Sqr((Sqr((x ^ 2) + (y ^ 2)) ^ 2) + (z ^ 2))
 
  ' e mostramos o resultado
  MsgBox "A distância entre os dois pontos é: " & distancia
End Sub

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

A distância entre os dois pontos é: 64.6029


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

Arquivos e diretórios em C++ - Como excluir um arquivo usando a função remove() do C++

Quantidade de visualizações: 10469 vezes
Em algumas situações nossos códigos C++ precisam excluir arquivos. Isso pode ser feito com o auxílio da função remove() ou _remove(), disponível no header io.h or stdio.h (trazido da linguagem C). Veja a assinatura desta função:

int remove(const char *filename);


Se o arquivo for excluído com sucesso a função retornará o valor 0. O retorno será -1 se um erro ocorrer. Neste caso a variável global errno será definido como um dos seguintes valores:

a) ENOENT - No such file or directory - O caminho do arquivo é inválido;

b) EACCESS - Acesso negado - Algum outro programa está usando este arquivo e mantém controle sobre o mesmo.

Veja um trecho de código no qual excluimos um arquivo:

#include <iostream>

using namespace std;

int main(int argc, char *argv[]){
  // vamos excluir este arquivo
  char arquivo[] = "C:\\Dev-Cpp\\arquivo.txt";

  // vamos testar se o arquivo foi excluído com sucesso
  if(remove(arquivo) != 0){
    cout << "Erro: " << strerror(errno) << endl;
  }
  else{
    cout << "Arquivo excluído com sucesso" << endl;
  }

  system("PAUSE"); // pausa o programa
  return EXIT_SUCCESS;
}

É possível usar a versão Unicode de remove(). O método _wremove(), também presente em io.h or stdio.h é útil quando precisamos internacionalizar nossas aplicações. Veja o exemplo:

#include <iostream>

using namespace std;

int main(int argc, char *argv[]){
  // vamos excluir este arquivo
  wchar_t arquivo[] = L"C:\\Dev-Cpp\\arquivo.txt";

  // vamos testar se o arquivo foi excluído com sucesso
  if(_wremove(arquivo) != 0){
    cout << "Erro: " << strerror(errno) << endl;
  }
  else{
    cout << "Arquivo excluído com sucesso" << endl;
  }

  system("PAUSE"); // pausa o programa
  return EXIT_SUCCESS;
}

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

Arquivo excluído com sucesso.


C# ::: Dicas & Truques ::: Arrays e Matrix (Vetores e Matrizes)

Como criar e inicializar um array de inteiros em C#

Quantidade de visualizações: 8597 vezes
Nesta dica mostrarei como declarar, construir e inicializar um vetor de ints na linguagem C#. Aqui os valores já estão sendo informados na construção do array, mas você poderá pedir para o usuário informar os valores também.

Veja o código para o exemplo:

using System;

namespace Estudos {
  class Program {
    static void Main(string[] args) {
      // cria um array de inteiros
      int[] valores = new int[5] { 3, 2, 5, 11, 13 };

      // exibe o valor do primeiro elemento
      Console.WriteLine("O valor do primeiro elemento é {0} ", 
        valores[0]);

      Console.WriteLine("\n\nPressione uma tecla para sair...");
      Console.ReadKey();
    }
  }
}

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

O valor do primeiro elemento é 3


C# ::: Windows Forms ::: TextBox

C# Windows Forms Avançado - Como rolar as linhas de um TextBox para cima uma de cada vez usando a API do Windows

Quantidade de visualizações: 7621 vezes
Em algumas situações gostaríamos de rolar para cima o conteúdo de um TextBox de múltiplas linhas uma linha de cada vez. Para isso podemos usar a API do Windows, mais especificamente a mensagem WM_VSCROLL com o valor SB_LINEUP para seu parâmetro wParam. O valor do parâmetro lParam é zero.

Veja um trecho de código que rola para cima o conteúdo de um TextBox uma linha de cada vez. Antes de executar este exemplo, tenha a certeza de ter um TextBox de múltiplas, com barras de rolagem e conteúdo que force o aparecimento das barras de rolagem.

Comece adicionando a linha:

using System.Runtime.InteropServices;

na seção de usings do seu formulário ou classe. Em seguida adicione o trecho de código abaixo no corpo da classe, como um método:

[DllImport("user32.dll", EntryPoint = "SendMessage", 
  CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, 
  IntPtr wParam, IntPtr lParam);

Finalmente coloque o código abaixo no evento Click de um botão:

private void button2_Click(object sender, EventArgs e){
  // antes de executar este exemplo certifique-se de que
  // a propriedade Multiline do TextBox esteja definida
  // como true e a propriedade ScrollBars contenha o valor
  // Vertical ou Both
  textBox1.Multiline = true;
  textBox1.ScrollBars = ScrollBars.Vertical;
    
  // constante para a mensagem WM_VSCROLL
  const uint WM_VSCROLL = 0x115;
  // constante para o parâmetro wParam
  const int SB_LINEUP = 0;
  
  // handle para a caixa de texto
  IntPtr handle = textBox1.Handle;
  IntPtr wParam = (IntPtr)SB_LINEUP;
  IntPtr lParam = IntPtr.Zero;
  
  // vamos fazer com que o TextBox role uma linha para cima
  SendMessage(textBox1.Handle, WM_VSCROLL, wParam, lParam);
}



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

Java para iniciantes - Como pesquisar uma substring em uma string e retornar sua posição inicial

Quantidade de visualizações: 218 vezes
Nesta dica mostrarei como é possível usar o método indexOf() da classe String para obter o índice (começando em 0) da primeira ocorrência de uma substring em uma string. Se a substring não for encontrada, o retorno será -1.

Veja o código completo para o exemplo:

package arquivodecodigos;

public class Estudos{
  public static void main(String[] args){
    String frase = "Programar em Java é muito bom";
    System.out.println("Frase: " + frase); 
    
    // verifica se a frase contém a palavra Java
    int res = frase.indexOf("Java");
     
    if(res > 0){
      System.out.println("A substring foi encontrada " +
        " na posicao (índice): " + res);
    }
    else{
      System.out.println("A substring nao foi encontrada");
    }
     
    System.exit(0);
  }
} 

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

Frase: Programar em Java é muito bom
A substring foi encontrada na posicao (índice): 13


Rust ::: Dicas & Truques ::: Strings e Caracteres

Como testar se uma string é um valor numérico em Rust usando a função is_numeric()

Quantidade de visualizações: 627 vezes
Nesta dica mostrarei como podemos verificar se uma string possui um valor numérico válido, ou seja, é composta apenas pelos dígitos de 0 a 9. Note que criei uma função validar_string_numerica() que recebe a string e retorna um valor bool, indicando se a string é um valor númerico válido ou não.

Note também o uso do método is_numeric() do tipo char para testar os caracteres individuais da string.

Veja o código Rust completo para o exemplo:

// função principal do programa Rust
fn main() {
  // vamos declarar uma string
  let numero = "3a2221";
  
  // vamos testar se a string é numérica
  if validar_string_numerica(numero.to_string()){
    println!("A string {} é numérica", numero);  
  }
  else{
    println!("A string {} não é numérica", numero);  
  }
}

// função quer permite verificar se uma string
// possui um valor numérico válido
fn validar_string_numerica(str: String) -> bool {
  // vamos varrer os caracteres da string
  for c in str.chars() {
    // o caractere atual não é numérico?
    if !c.is_numeric() {
      return false;
    }
  }
  
  // se chegou até aqui, a string é numérica
  return true;
}



Dart ::: Desafios e Lista de Exercícios Resolvidos ::: Arrays e Matrix (Vetores e Matrizes)

Exercício Resolvido de Dart - Escreva um programa Dart para mover todos os zeros para o final do vetor, sem alterar a ordem dos elementos já presentes no array

Quantidade de visualizações: 688 vezes
Pergunta/Tarefa:

Dado o seguinte vetor de inteiros:

// vamos declarar e construir um vetor (List) de 8 inteiros
List<int> valores = [0, 3, 0, 5, 7, 4, 0, 9];
Escreva um programa Dart para mover todos os zeros para o final do vetor, ou seja, para a direita, sem alterar a ordem dos elementos diferentes de zero já presentes no array e sem criar um vetor adicional ou temporário.

Sua saída deverá ser parecida com:

Vetor na ordem original:

0   3   0   5   7   4   0   9   

Vetor com os zeros deslocados para o final:

3   5   7   4   9   0   0   0
Resposta/Solução:

Veja a resolução comentada deste exercício usando Dart:

// Vamos importar a biblioteca dart:io
import "dart:io";

void main(){
  // vamos declarar e construir um vetor (List) de 8 inteiros
  List<int> valores = [0, 3, 0, 5, 7, 4, 0, 9];
    
  // vamos mostrar o vetor na ordem original
  print("Vetor na ordem original:\n");
  for(int i = 0; i < valores.length; i++){
    stdout.write("${valores[i]}   ");
  }
    
  // vamos inicializar j como 0 para que ele aponte para
  // o primeiro elemento do vetor
  int j = 0;
    
  // agora o laço for percorre todos os elementos do vetor,
  // incrementanto a variável i e deixando o j em 0
  for(int i = 0; i < valores.length; i++){
    // encontramos um valor que não é 0
    if(valores[i] != 0){
      // fazemos a troca entre os elementos nos índices
      // i e j
      int temp = valores[i];
      valores[i] = valores[j];
      valores[j] = temp;
      // e avançamos o j para o elemento seguinte
      j++;
    }
  }
    
  // agora mostramos o resultado
  print("\n\nVetor com os zeros deslocados para o final:\n");
  for(int i = 0; i < valores.length; i++){
    stdout.write("${valores[i]}   ");
  }
}

Não se esqueça: A resolução do exercício deve ser feita sem a criação de um vetor, array ou lista adicional, e os elementos diferentes de zero devem permanecer na mesma ordem que eles estavam antes.


C ::: Desafios e Lista de Exercícios Resolvidos ::: Operadores de Manipulação de Bits (Bitwise Operators)

Exercícios Resolvidos de C - Como converter de decimal para binário usando os operadores de bits em C

Quantidade de visualizações: 872 vezes
Pergunta/Tarefa:

Escreva um programa C para pede para o usuário informar um número decimal e faça a conversão para binário usando os operadores de bits.

Sua saída deverá ser parecida com:

Informe um número decimal: 9
O número binário é: 00000000000000000000000000001001
Resposta/Solução:

Veja a resolução completa para o exercício em C, comentada linha a linha:

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

// vamos definir o tamanho do vetor para guardar
// os dígitos do número binário
#define TAM_INT sizeof(int) * 8

int main(int argc, char *argv[]){
  // variáveis para ajudar a resolver o problema
  int decimal, indice, i;
  
  // vetor para guardar o número binário
  int binario[TAM_INT];

  setlocale(LC_ALL,""); // para acentos do português 

  // vamos pedir para o usuário informar um decimal inteiro
  printf("Informe um número decimal: ");
  scanf("%d", &decimal);

  // ajustamos índice para o último elemento do vetor
  indice = TAM_INT - 1;

  // enquanto índice for maior ou igual a 0
  while(indice >= 0){
    // vamos guardar o bit menos significativo LSB
    binario[indice] = decimal & 1;
    
    // diminuímos o índice
    indice--;

    // desloca bits para a direita uma posição
    decimal = decimal >> 1;
  }

  // agora vamos exibir o número binário
  printf("O número binário é: ");
  for(i = 0; i < TAM_INT; i++){
    printf("%d", binario[i]);
  }
 
  printf("\n\n");
  system("PAUSE");	
  return 0;
}



Java ::: Dicas & Truques ::: Data e Hora

Como converter um objeto Calendar em um objeto Date em Java

Quantidade de visualizações: 11252 vezes
Muitas vezes precisamos converter um objeto Calendar em um objeto Date em Java. Isso pode ser feito usando-se o método getTime() da classe Calendar.

Este método retorna um objeto da classe Date representando o estado atual do objeto Calendar em milisegundos desde o Epoch. Veja um exemplo dessa conversão e o uso da classe SimpleDateFormat para formatar o resultado:

package estudos;

import java.util.*;
import java.text.*;

public class Estudos{ 
  public static void main(String args[]){ 
    Calendar cal = Calendar.getInstance();
    Date data = cal.getTime();
    
    // formata e exibe a data e hora
    Format formato = new SimpleDateFormat(
      "dd/MM/yyyy - HH:mm:ss");
    System.out.println(formato.format(data));
  } 
}

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

09/09/2022 - 14:39:53

Carregar Publicações Anteriores


Nossas 20 dicas & truques de programação mais populares

Você também poderá gostar das dicas e truques de programação abaixo

Nossas 20 dicas & truques de programação mais recentes

Últimos Projetos e Códigos Fonte Liberados Para Apoiadores do Site

Últimos Exercícios Resolvidos

E-Books em PDF

E-Book 350 Exercícios Resolvidos de Java - PDF com 500 páginas
Domine lógica de programação e a linguagem Java com o nosso E-Book 350 Exercícios Exercícios de Java, para você estudar onde e quando quiser.

Este e-book contém exercícios resolvidos abrangendo os tópicos: Java básico, matemática e estatística, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book
E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser.

Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book

Linguagens Mais Populares

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



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