2023-12-06 17:06:42 -03:00
|
|
|
public class BST {
|
|
|
|
|
private Node root;
|
|
|
|
|
// necessario para verificacao de quantos nos visitados pela funcao search
|
|
|
|
|
// (desempenho)
|
|
|
|
|
private int count = 0;
|
|
|
|
|
|
|
|
|
|
// Construtor
|
|
|
|
|
public BST() {
|
|
|
|
|
this.root = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getCount() {
|
|
|
|
|
return count;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Métodos de inserção e busca
|
|
|
|
|
public void insert(ProgramaNetflix programa) {
|
|
|
|
|
root = insertRec(root, programa);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Método para encontrar o valor mínimo na árvore
|
|
|
|
|
public ProgramaNetflix minValue() {
|
|
|
|
|
return minValue(root);
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-09 22:50:18 -03:00
|
|
|
public void cleanup() {
|
|
|
|
|
cleanupRec(root);
|
|
|
|
|
root = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void cleanupRec(Node node) {
|
|
|
|
|
if (node != null) {
|
|
|
|
|
cleanupRec(node.left);
|
|
|
|
|
cleanupRec(node.right);
|
|
|
|
|
remove(node.programa.getId());
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-12-06 17:06:42 -03:00
|
|
|
|
|
|
|
|
private Node insertRec(Node root, ProgramaNetflix programa) {
|
|
|
|
|
if (root == null) {
|
|
|
|
|
root = new Node(programa);
|
|
|
|
|
return root;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Adicione a lógica de comparação para decidir em qual subárvore inserir
|
|
|
|
|
if (programa.getId().compareTo(root.programa.getId()) < 0) {
|
|
|
|
|
root.left = insertRec(root.left, programa);
|
|
|
|
|
} else if (programa.getId().compareTo(root.programa.getId()) > 0) {
|
|
|
|
|
root.right = insertRec(root.right, programa);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return root;
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-09 22:50:18 -03:00
|
|
|
public String search(String id) {
|
|
|
|
|
count = 1;
|
|
|
|
|
ProgramaNetflix programa = searchRec(root, id);
|
|
|
|
|
|
|
|
|
|
if (programa != null) {
|
|
|
|
|
return programa.getTitulo();
|
|
|
|
|
} else {
|
|
|
|
|
return "";
|
|
|
|
|
}
|
2023-12-06 17:06:42 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private ProgramaNetflix searchRec(Node root, String id) {
|
|
|
|
|
count++;
|
|
|
|
|
// Caso base: a árvore ou subárvore está vazia ou encontramos o nó com o ID
|
|
|
|
|
// correspondente
|
|
|
|
|
if (root == null || root.programa.getId().equals(id)) {
|
|
|
|
|
return (root != null) ? root.programa : null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Se o ID a ser pesquisado for menor que o ID do nó atual, busca na subárvore
|
|
|
|
|
// esquerda
|
|
|
|
|
if (id.compareTo(root.programa.getId()) < 0) {
|
|
|
|
|
return searchRec(root.left, id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Se o ID a ser pesquisado for maior que o ID do nó atual, busca na subárvore
|
|
|
|
|
// direita
|
|
|
|
|
return searchRec(root.right, id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Método para calcular a altura da árvore
|
|
|
|
|
public int height() {
|
|
|
|
|
return height(root);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Método privado para calcular a altura da árvore
|
|
|
|
|
private int height(Node root) {
|
|
|
|
|
if (root == null) {
|
|
|
|
|
return -1; // Árvore vazia tem altura -1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int leftHeight = height(root.left);
|
|
|
|
|
int rightHeight = height(root.right);
|
|
|
|
|
|
|
|
|
|
// A altura da árvore é o máximo entre as alturas das subárvores esquerda e
|
|
|
|
|
// direita
|
|
|
|
|
return Math.max(leftHeight, rightHeight) + 1;
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-09 22:50:18 -03:00
|
|
|
public boolean remove(String id) {
|
|
|
|
|
if (search(id).isEmpty()) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2023-12-06 17:06:42 -03:00
|
|
|
root = removeRec(root, id);
|
2023-12-09 22:50:18 -03:00
|
|
|
return true;
|
2023-12-06 17:06:42 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Node removeRec(Node root, String id) {
|
|
|
|
|
// Caso base: árvore ou subárvore está vazia
|
|
|
|
|
if (root == null) {
|
|
|
|
|
return root;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Encontra o nó a ser removido
|
|
|
|
|
if (id.compareTo(root.programa.getId()) < 0) {
|
|
|
|
|
root.left = removeRec(root.left, id);
|
|
|
|
|
} else if (id.compareTo(root.programa.getId()) > 0) {
|
|
|
|
|
root.right = removeRec(root.right, id);
|
|
|
|
|
} else {
|
|
|
|
|
// Nó com um filho ou sem filhos
|
|
|
|
|
if (root.left == null) {
|
|
|
|
|
return root.right;
|
|
|
|
|
} else if (root.right == null) {
|
|
|
|
|
return root.left;
|
|
|
|
|
}
|
|
|
|
|
// Nó com dois filhos: encontra o sucessor in-order (menor nó na subárvore
|
|
|
|
|
// direit)
|
|
|
|
|
root.programa = minValue(root.right);
|
|
|
|
|
|
|
|
|
|
// Remove o sucessor in-order
|
|
|
|
|
root.right = removeRec(root.right, root.programa.getId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return root;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private ProgramaNetflix minValue(Node root) {
|
|
|
|
|
// O valor mínimo é o nó mais à esquerda na árvore
|
|
|
|
|
while (root.left != null) {
|
|
|
|
|
root = root.left;
|
|
|
|
|
}
|
|
|
|
|
return root.programa;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Classe interna Node para representar os nós da árvore
|
|
|
|
|
private class Node {
|
|
|
|
|
private ProgramaNetflix programa;
|
|
|
|
|
private Node left;
|
|
|
|
|
private Node right;
|
|
|
|
|
|
|
|
|
|
public Node(ProgramaNetflix programa) {
|
|
|
|
|
this.programa = programa;
|
|
|
|
|
this.left = null;
|
|
|
|
|
this.right = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|