4
respostas

Exercicio da USP

Pessoal, tudo bom? Resolvi estudar um pouco de estrutura de dados com outros exercícios e estou com uma dúvida. Fiz o código que está quase pronto, mas minha saída está errada, alguém poderia me ajudar com ideias do que posso fazer para arrumar? Enunciado:

Implemente um método na classe ArvoreBinaria que imprima os id de uma árvore binária com recuos de margem proporcionais ao nível do nó. Por exemplo, para a árvore binária abaixo: (Temos a seguinte saída, os caracteres ‘-‘ representa null.) Insira aqui a descrição dessa imagem para ajudar na acessibilidade

minha saída Insira aqui a descrição dessa imagem para ajudar na acessibilidade

link com o meu código: https://replit.com/join/mmtdyrxjnu-luciomoriyama A questão original veio daqui - https://www.ime.usp.br/~pf/algoritmos/aulas/bint.html (exercício 4)

4 respostas

Oii Lucio, tudo bem?

Desculpa pela demora em obter retorno.

Tentei clicar no link do replit, mas não funcionou por aqui. :( Consegue me mandar o link atualizado?

oieee, eu que peço desculpa, consegui resolver, já vou subir o código! =)

CLASSE NO

public class No<GENERICO>{
  private GENERICO valor;
  private No<GENERICO> esquerda;
  private No<GENERICO> direita;
  public No(GENERICO novoValor){
    this.valor = novoValor;
    this.esquerda = null;
    this.direita = null;}
  public GENERICO getValor(){
    return valor; }
  public void setValor(GENERICO valor){
    this.valor = valor; }
  public No<GENERICO> getEsquerda(){
    return esquerda;}
  public void setEsquerda(No<GENERICO> esquerda){
    this.esquerda = esquerda;}
  public No<GENERICO> getDireita(){
  return direita;}
  public void setDireita(No<GENERICO> direita){
    this.direita = direita;}}

CLASSE MAIN

public class Main {
  public static void main(String[] args) {
System.out.println("-----------------------------QUESTÃO A----------------------------------------------");
    Arvore<Integer> arvoreA = new Arvore<Integer>();
    arvoreA.inserir(6);
    arvoreA.inserir(10);
    arvoreA.inserir(11);
    arvoreA.inserir(12);
    arvoreA.inserir(8);
    arvoreA.inserir(9);
    arvoreA.inserir(7);
    arvoreA.inserir(2);
    arvoreA.inserir(4);
    arvoreA.inserir(1);
    arvoreA.inserir(3);
    arvoreA.inserir(5);
    System.out.println("\n\n RESPOSTA A: O número de folhas é igual a " + arvoreA.contadorNoEsqerdo() + "\n");
System.out.println("-----------------------------QUESTÃO B----------------------------------------------");
    Arvore<Integer> arvoreB = new Arvore<Integer>();
    arvoreB.inserir(555);
    arvoreB.inserir(333);
    arvoreB.inserir(111);
    arvoreB.inserir(444);
    arvoreB.inserir(888);
    arvoreB.inserir(999);
        System.out.println("\n\n RESPOSTA B: Impressão da Árvore\n");
    arvoreB.preOrdem(arvoreB.getRaiz(),"");}}

CLASSE ARVORE

import java.util.*;
public class Arvore<GENERICO extends Comparable> {
  private No<GENERICO> raiz;
  private int nEsquerdaNo;
  static String defaultSpaces = "   ";
  static String Spaces = "   ";
  public Arvore() {
    this.raiz = null;}
  public void inserir(GENERICO valor) {
    No<GENERICO> novoNo = new No<GENERICO>(valor);
    if (raiz == null) {
      this.raiz = novoNo;
    } else {
      No<GENERICO> atual = this.raiz;
      while (true) {
        if (novoNo.getValor().compareTo(atual.getValor()) == -1) {
          // 0 para igual, -1 para menor e 1 maior
          if (atual.getEsquerda() != null) {
            atual = atual.getEsquerda();
          } else {
            atual.setEsquerda(novoNo);
            break;}
        } else {
          if (atual.getDireita() != null) {
            atual = atual.getDireita();} else {
            atual.setDireita(novoNo);
            break;}}}} }
  public No<GENERICO> getRaiz() {
    return raiz;}
  public void emOrdem(No<GENERICO> atual) {
    if (atual != null) {
      emOrdem(atual.getEsquerda());
      System.out.println(atual.getValor());
      emOrdem(atual.getDireita());} }
  // QUESTÃO A
  private void dfs(No<GENERICO> no) {
    if (no == null)
      return;
    No<GENERICO> esquerda = no.getEsquerda();
    if (esquerda != null) {
      nEsquerdaNo++;
      dfs(esquerda);}
    dfs(no.getDireita());}
  public int contadorNoEsqerdo() {
    nEsquerdaNo = 0;
    dfs(raiz);
    return nEsquerdaNo; }
  // QUESTÃO B
public void preOrdem(No<GENERICO> atual, String spaces) {
  System.out.print(spaces);
  if (atual != null) {
    if ((atual.getEsquerda() != null) && (atual.getDireita() != null)) {
      System.out.println(atual.getValor());


preOrdem(atual.getEsquerda(), spaces + defaultSpaces);
      preOrdem(atual.getDireita(), spaces + defaultSpaces);
    } else {
      if ((atual.getEsquerda() != null) && (atual.getDireita() == null)) {
        System.out.println(atual.getValor());
        System.out.println(spaces + defaultSpaces + "-");
        preOrdem(atual.getEsquerda(), spaces + defaultSpaces);
      } else {
        if ((atual.getEsquerda() == null) && (atual.getDireita() != null)) {
          System.out.println(atual.getValor());
          System.out.println(spaces + defaultSpaces + "-");
          preOrdem(atual.getDireita(), spaces + defaultSpaces);
        } else {
          System.out.println(atual.getValor());
          System.out.println(spaces + defaultSpaces + "-");
          System.out.println(spaces + defaultSpaces + "-");
        }}}}}}

Ahhh que ótimo que deu certo!! Obrigada por postar a solução!

Bons estudos :)