Implementar Árvore AVL + outras dúvidas

Opa, pessoal

Alguém poderia me auxiliar com a implementação de uma árvore AVL no código que estou escrevendo?

Separei um código pronto que encontrei no Javatpoint [https://www.javatpoint.com/avl-tree-program-in-java], mas não estou sabendo como inserir no que já escrevi.

Além disso, há outros problemas:

Um deles é referente ao próprio código da árvore AVL: a IDE encontra dois erros de return no código do Javatpoint – vou linkar imagens dos erros.

Outro problema, um pouco mais simples, é referente ao programa retornar para o menu inicial.

O programa, em resumo, é um cadastro de usuários, onde [1] o administrador insere os dados e cada usuário registrado vai pra uma ArrayList. A partir daí, preciso implementar uma árvore AVL pra [2] buscar os usuários registrados. Outra coisa que o sistema precisa entregar é [3] uma lista de usuários de acordo com data e horário. No caso, como uma ordem de chegada num hospital: uma lista por ordem de quem será atendido primeiro, segundo, terceiro, etc.

Quando rodo o programa, consigo cadastrar as informações, mas, no final, além de não parecer que estão sendo alocadas como objetos no ArrayList, tbm gera um problema de retorno para o menu inicial, onde o administrador escolhe se: [a] faz um novo cadastro; [b] faz uma busca dos usuários cadastrados; [c] acessa a lista de atendimento; ou [d] sai do sistema.

Enfim, não sei se consegui explicar mto bem e acho que talvez seja bastante coisa, mas estou perdido faz um tempo e realmente preciso de ajuda…

Os erros do código da árvore AVL:

O meu código:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;

public class MNT {    
    private static final int CADASTRO = 1;
    private static final int BUSCA = 2;
    private static final int ATENDIMENTO = 3;
    private static final int SAIR = 4;

    public static class Registro {
        private static boolean iniciarSistema;          
        private String registroDoNome;
        private String registroDoNascimento;
        private String registroDoEmail;
        private String registroDoTelefone;
        private String registroDoFuncionario;
        private String registroDoVisitante;
        private String registroDoVoluntario;
        private String registroDoDoador;
        private String registroDoAtendido;

        public Registro(String registroDoNome, String registroDoNascimento, String registroDoEmail, String registroDoTelefone, String registroDoFuncionario, String registroDoVisitante, String registroDoVoluntario, String registroDoDoador, String registroDoAtendido) {
            // this.registroDaData = registroDaData;
            this.registroDoNome = registroDoNome;
            this.registroDoNascimento = registroDoNascimento;
            this.registroDoEmail = registroDoEmail;
            this.registroDoTelefone = registroDoTelefone;
            this.registroDoFuncionario = registroDoFuncionario;
            this.registroDoVisitante = registroDoVisitante;
            this.registroDoVoluntario = registroDoVoluntario;
            this.registroDoDoador = registroDoDoador;
            this.registroDoAtendido = registroDoAtendido;
        }

        public static void setIniciarSistema(boolean iniciarSistema) {
            Registro.iniciarSistema = iniciarSistema;
        }            
        public String getRegistroDoNome() {
            return registroDoNome;
        }
        public void setRegistroDoNome(String registroDoNome) {
            this.registroDoNome = registroDoNome;
        }
        public String getRegistroDoNascimento() {
            return registroDoNascimento;
        }
        public void setRegistroDoNascimento(String registroDoNascimento) {
            this.registroDoNascimento = registroDoNascimento;
        }
        public String getRegistroDoEmail() {
            return registroDoEmail;
        }
        public void setRegistroDoEmail(String registroDoEmail) {
            this.registroDoEmail = registroDoEmail;
        }
        public String getRegistroDoTelefone() {
            return registroDoTelefone;
        }
        public void setRegistroDoTelefone(String registroDoTelefone) {
            this.registroDoTelefone = registroDoTelefone;
        }
        public String getRegistroDoFuncionario() {
            return registroDoFuncionario;
        }
        public void setRegistroDoFuncionario(String registroDoFuncionario) {
            this.registroDoFuncionario = registroDoFuncionario;
        }
        public String getRegistroDoVisitante() {
            return registroDoVisitante;
        }
        public void setRegistroDoVisitante(String registroDoVisitante) {
            this.registroDoVisitante = registroDoVisitante;
        }
        public String getRegistroDoVoluntario() {
            return registroDoVoluntario;
        }
        public void setRegistroDoVoluntario(String registroDoVoluntario) {
            this.registroDoVoluntario = registroDoVoluntario;
        }
        public String getRegistroDoDoador() {
            return registroDoDoador;
        }
        public void setRegistroDoDoador(String registroDoDoador) {
            this.registroDoDoador = registroDoDoador;
        }
        public String getRegistroDoAtendido() {
            return registroDoAtendido;
        }
        public void setRegistroDoAtendido(String registroDoAtendido) {
            this.registroDoAtendido = registroDoAtendido;
        }

        public static void main(String[] args) {                
            ArrayList<Registro> registros = new ArrayList<Registro>();
            setIniciarSistema(true);                
            while (iniciarSistema) {
                iniciarMenu();
            }
        }

        private static void iniciarMenu() {
            ArrayList<Registro> registros = new ArrayList<Registro>();
            Scanner entradaDeOpcaoDoMenu = new Scanner(System.in);
            int opcaoDoMenuSelecionada;

            System.out.println("\n1) CADASTRO");
            System.out.println("2) BUSCA");
            System.out.println("3) ATENDIMENTO");
            System.out.println("4) SAIR");
            System.out.print("\nInforme sua opção: ");
            opcaoDoMenuSelecionada = Integer.parseInt(entradaDeOpcaoDoMenu.nextLine());

            switch (opcaoDoMenuSelecionada) {
                case CADASTRO:
                    adicionarAoRegistro(registros);
                    break;

                case BUSCA:
                    //
                    break;

                case ATENDIMENTO:
                    // Collections.sort(ArrayList<Registro> registros):
                    System.out.println("\nOrdem de atendimento: " + registros);
                    entradaDeOpcaoDoMenu.close();
                    setIniciarSistema(false);
                    break;

                case SAIR:
                    System.out.println("\n=> DESLIGANDO SISTEMA");
                    entradaDeOpcaoDoMenu.close();
                    setIniciarSistema(false);
                    break;

                default:
                    System.out.println("=> OPÇÃO INVÁLIDA");
                    break;
            }
        }

        private static void adicionarAoRegistro(ArrayList<Registro> listaDeRegistros) {
            Scanner teclado = new Scanner(System.in);
            String dataDeAgendamento = new String();
            Date dataDoSistema = new Date();
            SimpleDateFormat formatoDaData = new SimpleDateFormat("dd/MM/yyyy");
            formatoDaData.setLenient(false);
            boolean validarData = false;

            System.out.println("\n================\n" + " INFORME A DATA\n" + "================\n");

            while (validarData == false) {
                System.out.println("Data de agendamento (DD/MM/AAAA): ");
                dataDeAgendamento = teclado.nextLine();
                System.out.println();

                try {
                    dataDoSistema = formatoDaData.parse(dataDeAgendamento);
                    System.out.println("=> VALORES VÁLIDOS\n");
                    System.out.println("Data no sistema: " + dataDoSistema);
                    validarData = true;
                } catch (ParseException e) {
                    System.out.println("=> VALORES INVÁLIDOS\n");
                }
            }

            SimpleDateFormat dataFormatada = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
            System.out.println("Data e horário do agendamento:\n " + dataFormatada.format(dataDoSistema));
            // teclado.close();

            System.out.println("\n===================\n" + " CADASTRO DE DADOS\n" + "===================\n");
            System.out.print("Nome completo: ");
            String registroDoNome = (teclado.nextLine());
            System.out.print("Data de nascimento: ");
            String registroDoNascimento = (teclado.nextLine());
            System.out.print("E-mail: ");
            String registroDoEmail = (teclado.nextLine());
            System.out.print("Telefone: ");
            String registroDoTelefone = (teclado.nextLine());
            System.out.println("\n===================================\n" + " Responda apenas com 'Sim' ou 'Não'\n" + "===================================\n");
            System.out.print("Funcionário: ");
            String registroDoFuncionario = (teclado.nextLine());
            System.out.print("Visitante: ");
            String registroDoVisitante = (teclado.nextLine());
            System.out.print("Voluntário: ");
            String registroDoVoluntario = (teclado.nextLine());
            System.out.print("Doador: ");
            String registroDoDoador = (teclado.nextLine());
            System.out.print("Atendido: ");
            String registroDoAtendido = (teclado.nextLine());
            System.out.println("\n===================\n" + " DADOS CADASTRADOS\n" + "===================\n");
            System.out.println("Nome completo: " + registroDoNome);
            System.out.println("Data de nascimento: " + registroDoNascimento);
            System.out.println("E-mail: " + registroDoEmail);
            System.out.println("Telefone: " + registroDoTelefone);
            System.out.println("----------------");
            System.out.println("Funcionário: " + registroDoFuncionario);
            System.out.println("Visitante: " + registroDoVisitante);
            System.out.println("Voluntário: " + registroDoVoluntario);
            System.out.println("Doador: " + registroDoDoador);
            System.out.println("Atendido: " + registroDoAtendido);
            System.out.println("\n===================\n");
            // System.out.print("\n__________________________________");
            listaDeRegistros.add(new Registro(registroDoNome, registroDoNascimento, registroDoEmail, registroDoTelefone, registroDoFuncionario, registroDoVisitante, registroDoVoluntario, registroDoDoador, registroDoAtendido));
            teclado.close();
        }
    }
}

P.S.: Desculpa pela bagunça no código, ainda tô aprendendo a organizar melhor