Baixe o app para aproveitar ainda mais
Prévia do material em texto
Senac EAD Produção Textual Individual 1 Senac São Paulo – Todos os Direitos Reservados DISCIPLINA ESTRUTURA DE DADOS PROFESSOR(ES) AUTOR(ES) FABIO APARECIDO GAMARRA LUBACHESKI Produção Textual Individual Tema Utilizando Estrutura de Dados Árvore Binária Texto base (texto, gráficos, tabelas, imagens) Uma árvore (tree) é uma estrutura de dados que armazena elementos de maneira hierárquica, dentre as árvores existentes, as binárias são as mais utilizadas. As árvores binárias possuem no máximo duas sub-árvores, a sub-árvore direita e sub- árvore esquerda, onde cada sub-árvore é uma árvore binária. Perceba que a definição é recursiva e, devido a isso, muitas operações sobre árvores binárias utilizam recursão. Um tipo abstrato de dados para representar uma árvore binária é apresentado abaixo, considere que as classes já estão implementadas corretamente: public class No { private long id; private No esq,dir; public No(long id, No esq, No dir){ this.id = id; this.esq = esq; this.dir = dir; } public long getId() { return this.id; } public No getEsq() { return esq; } public No getDir() { return dir; } } public class ArvoreBinaria { private No raiz; public ArvoreBinaria() { this.raiz = null; } . .// outros métodos . . . . } Enunciado A) Dada uma árvore binária com nós já inseridos, um nó é da esquerda festiva se ele for filho esquerdo de algum outro nó (abaixo os nós marcados são da esquerda festiva). Implemente um método na classe ArvoreBinaria que conta e retorna o número de nós da esquerda festiva de uma árvore binária. Para o exemplo abaixo o método retorna 5. B) 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: 888 555 333 444111 999 Senac EAD Produção Textual Individual 2 Senac São Paulo – Todos os Direitos Reservados Temos a seguinte saída, os caracteres ‘-‘ representa null. 555 333 111 - - 444 - - 888 - 999 - - Orientações Gerais Observações do professor: Reveja as Web Conferências gravadas para se basear na implementação da solução dessa atividade. Orientação de Entrega: Esta atividade deverá ser entregue no item Produção Textual Individual do menu principal. Prazo de Entrega: Consultar o calendário de atividades Tamanho máximo do texto: 30 linhas ou 1 página. Uso de fontes de terceiros (citações) deve ser referenciada conforme Guia de Normalização do Senac: http://www3.sp.senac.br/hotsites/campus_santoamaro/cd/arquivos/biblioteca/guia_norma tizacao.pdf http://www3.sp.senac.br/hotsites/campus_santoamaro/cd/arquivos/biblioteca/guia_normatizacao.pdf http://www3.sp.senac.br/hotsites/campus_santoamaro/cd/arquivos/biblioteca/guia_normatizacao.pdf PTI ESTRUTURA DE DADOS Questão A e B Primeira Classe public class No { private long id; private Object elemento; private No esq; private No dir; public No(long id, Object elemento, No esq, No dir) { this.id = id; this.elemento = elemento; this.esq = esq; this.dir = dir; } public void setId(long id) { this.id = id; } public long getId() { return this.id; } public void setElemento(Object elemento) { this.elemento = elemento; } public Object getElemento() { return elemento; } public void setEsq(No esq) { this.esq = esq; } public No getEsq() { return esq; } public void setDir(No dir) { this.dir = dir; } public No getDir() { return dir; } public String toString() { return getElemento() == null ? "" : (String) getElemento(); } ) Segunda Classe preFixEsq = Questão A preFix2 = Questão B import java.util.ArrayDeque; import java.util.Deque; public class ArvoreBinaria { private No raiz; public static int qtdeNoEsquerda = 0; public ArvoreBinaria() { this.raiz = null; } public No getArvore() { return raiz; } public void setArvore(No raiz) { this.raiz = raiz; } public void insere(long id, Object elemento) { No novoNo = new No(id, elemento, null, null); if (raiz == null) { raiz = novoNo; } else { No atual = raiz; No pai; while (true) { pai = atual; if (id < atual.getId()) { atual = atual.getEsq(); if (atual == null) { pai.setEsq(novoNo); return; } } else { atual = atual.getDir(); if (atual == null) { pai.setDir(novoNo); return; } } } } } public int preFixEsq(No atual) { try { if (atual.getEsq() != null) { qtdeNoEsquerda++; } } catch (Exception e) { } if (atual != null) { preFixEsq(atual.getEsq()); preFixEsq(atual.getDir()); } return qtdeNoEsquerda; } public void preFix2(No atual, int qnt) { String espaço = ""; for (int i = 1; i <= qnt; i++) { espaço += " "; } if (atual != null) { qnt++; System.out.println(espaço + atual.getId()); if (atual.getEsq() == null) { System.out.println(espaço + " -"); } if (atual.getDir() == null) { System.out.println(espaço + " -"); } preFix2(atual.getEsq(), qnt); preFix2(atual.getDir(), qnt); } } public void imprimeEleArvore() { preFixEsq(raiz); } public void imprimeEleArvore2() { preFix2(raiz, 0); } public void imprimeArvore() { percorreArvore(raiz); } private long calcAltura(No atual, long a) { if (atual != null) { long e, d; e = calcAltura(atual.getEsq(), a) + 1; d = calcAltura(atual.getDir(), a) + 1; if (e > d) { return a + e; } else { return a + d; } } return a; } public long alturaArvore() { long a = 0; return calcAltura(raiz, a); } public String PreOrdem() { if (getArvore() == null) { return ""; } return readPreOrdem(getArvore()); } private String readPreOrdem(No no) { if (no == null) { return ""; } String rt = no.toString(); if (no.getEsq() != null) { rt += (rt.isEmpty() ? "" : ",") + readPreOrdem(no.getEsq()); qtdeNoEsquerda++; } if (no.getEsq() != null) { rt += (rt.isEmpty() ? "" : ",") + readPreOrdem(no.getDir()); } return rt; } private long calcAlturaNoEsq(No atual, long a) { if (atual != null) { long e = calcAltura(atual.getEsq(), a) + 1; return e; } return a; } public long alturaArvoreNoEsq() { long a = 0; return calcAlturaNoEsq(raiz, a); } public void percorreArvore(No no) { int qtNoEsq = 0, qtNoDir = 0; Deque<No> fila = new ArrayDeque<>(); fila.add(no); while (!fila.isEmpty()) { No atual = fila.removeFirst(); System.out.printf("%s, ", atual.getElemento()); if (atual.getEsq() != null) { fila.add(atual.getEsq()); qtNoEsq++; } if (atual.getDir() != null) { fila.add(atual.getDir()); qtNoDir++; } } System.out.println("qtNoEsq= " + qtNoEsq); } } Método main para rodar o código public class ExemploDeArvoreBinaria { public static void main(String[] args) { System.out.println("\nQuestão A"); System.out.println("\n"); ArvoreBinaria treeone = new ArvoreBinaria(); treeone.insere(10,"A"); treeone.insere(5,"B"); treeone.insere(15,"C"); treeone.insere(12,"D"); treeone.insere(7,"E"); treeone.insere(12,"F"); treeone.insere(6,"G"); treeone.insere(8,"H"); treeone.insere(17,"I"); treeone.insere(11,"J"); treeone.insere(14,"K"); treeone.insere(3,"L"); treeone.imprimeEleArvore(); System.out.println("Quantidade de Nó a Esquerda: " + treeone.qtdeNoEsquerda); System.out.println("\nAltura: " + treeone.alturaArvore()); System.out.println("\nPreOrdem: " + treeone.PreOrdem()); System.out.println("\n"); System.out.println("\n"); System.out.println("Questão B"); System.out.println("\n"); String espaço; ArvoreBinaria treetwo = new ArvoreBinaria(); treetwo.insere(555, "A"); treetwo.insere(333, "B"); treetwo.insere(888, "C"); treetwo.insere(111, "D"); treetwo.insere(444, "E"); treetwo.insere(999, "F"); treetwo.imprimeEleArvore2(); } } ESTRUTURA DE DADOS - REF. 2021.4 PTI ESTRUTURA DE DADOS - Senac ead Ma
Compartilhar