Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.*;
- import java.util.Scanner;
- class HeadPt {
- Node root;
- HeadPt (Node root) {
- this.root = root;
- }
- }
- class Node {
- int data;
- Node leftPt;
- Node rightPt;
- Node (int data) {
- this.data = data;
- this.leftPt = null;
- this.rightPt = null;
- }
- }
- public class Main {
- static HeadPt head;
- enum ErrCode {
- SUCCESS,
- INCORRECT_DATA,
- TREE_NOT_EXIST,
- SUCH_ELEMENT_ALREADY_EXIST
- }
- static final String[] ERRORS = {"Удача",
- "Данные некорректные или число слишком большое (должно быть от %d до %d)\n",
- "Сначала стоит создайте дерево!",
- "Такой элемент уже существует"};
- static final String CHOICE_SAVE_TEXT = """
- Вы хотите сохранить результат?
- 1) да
- 2) нет
- """;
- enum Choice {
- createTree("Создать новое дерево"),
- addElem("Добавить элемент"),
- loadFormFile("Загрузить списки из файла"),
- print("Визуализировать дерево"),
- checkRes("Вывести"),
- close("Закрыть");
- private final String inf;
- Choice (String infLine) {
- this.inf = infLine;
- }
- private String getInf(){return this.ordinal() + ") " + this.inf;}
- }
- static final int MIN_NODE = -99999,
- MAX_NODE = 99999;
- static final char ROOT_CHAR = '+',
- LEFT_CHAR = 'L',
- RIGHT_CHAR = 'R';
- static final String INFORMATION_TEXT = """
- Инструкция:
- 1) Элементы дерева должны быть от -99999 до 99999
- 2) Элементы не могут повторяться
- """,
- ATTENTION_TEXT = """
- Внимание! Старое дерево удалится, вы уверены?
- 1) Да
- 2) Нет
- """;
- static HeadPt createTree(int elem) {
- Node firstNode = new Node(elem);
- return new HeadPt(firstNode);
- }
- static boolean addElem(Node head, int elem) {
- boolean isAdded = true;
- if (elem > head.data) {
- if (head.rightPt != null)
- isAdded = addElem(head.rightPt, elem);
- else
- head.rightPt = new Node(elem);
- } else if (elem < head.data) {
- if (head.leftPt != null)
- isAdded = addElem(head.leftPt, elem);
- else
- head.leftPt = new Node(elem);
- } else {
- isAdded = false;
- }
- return isAdded;
- }
- static int getHeight(Node node) {
- if (node == null)
- return 0;
- int leftHeight = getHeight(node.leftPt);
- int rightHeight = getHeight(node.rightPt);
- return Math.max(leftHeight, rightHeight) + 1;
- }
- static void checkHeight(Node node, StringBuilder answer) {
- if (node == null)
- return;
- int leftHeight = getHeight(node.leftPt);
- int rightHeight = getHeight(node.rightPt);
- if (leftHeight != rightHeight)
- answer.append(node.data + " ");
- checkHeight(node.leftPt,answer);
- checkHeight(node.rightPt,answer);
- }
- static void printTree(Node node, int layer, char side) {
- if (node.rightPt != null)
- printTree(node.rightPt, layer + 1, RIGHT_CHAR);
- for (int i = 0; i < layer; i++)
- System.out.print(" ");
- System.out.println("(" + side + ")" + node.data);
- if (node.leftPt != null)
- printTree(node.leftPt, layer + 1, LEFT_CHAR);
- }
- static void printMenu() {
- Choice[] choices = Choice.values();
- for (Choice choice : choices) {
- System.out.println(choice.getInf());
- }
- }
- static void printInf(Scanner input) {
- System.out.println(INFORMATION_TEXT);
- System.out.println("нажмите enter чтобы продолжить");
- input.nextLine();
- }
- static ErrCode enterOneNum(int[] numberArr, Scanner input, final int MIN, final int MAX) {
- int number = 0;
- ErrCode err = ErrCode.SUCCESS;
- try {
- number = Integer.parseInt(input.nextLine());
- } catch (NumberFormatException e) {
- err = ErrCode.INCORRECT_DATA;
- }
- if ((err == ErrCode.SUCCESS) && (number < MIN || number > MAX))
- err = ErrCode.INCORRECT_DATA;
- numberArr[0] = err == ErrCode.SUCCESS ? number : 0;
- return err;
- }
- static int getNumConsole(Scanner input, final int MIN, final int MAX) {
- ErrCode err;
- int[] numberArr = {0};
- do {
- err = enterOneNum(numberArr, input, MIN, MAX);
- if (err != ErrCode.SUCCESS) {
- System.err.printf(ERRORS[err.ordinal()], MIN, MAX);
- System.out.println("Введите снова");
- }
- } while (err != ErrCode.SUCCESS);
- return numberArr[0];
- }
- static Choice getChoice(Scanner input) {
- int choice;
- int maxChoice = Choice.values().length - 1;
- choice = getNumConsole(input, 0, maxChoice);
- return Choice.values()[choice];
- }
- public static void InputListFromFile(String fileName) {
- String inputedString = "";
- String[] stringNums;
- boolean isCorrect = true;
- try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
- try {
- inputedString = reader.readLine();
- } catch (NumberFormatException exception) {
- isCorrect = false;
- System.err.println("Не верный тип данных. Проверьте файл.");
- }
- } catch (IOException ex) {
- isCorrect = false;
- System.err.println("Что-то пошло не так!");
- }
- // разделяем строки
- stringNums = inputedString.split(" ");
- try {
- head = createTree(Integer.parseInt(stringNums[0]));
- } catch (NumberFormatException ex) {
- System.err.println("Проблемы в файле!");
- isCorrect = false;
- head = null;
- }
- for (int i = 1; i < stringNums.length; i++) {
- if (isCorrect) {
- try {
- addElem(head.root, Integer.parseInt(stringNums[i]));
- } catch (NumberFormatException ex) {
- System.err.println("Проблемы в файле!");
- isCorrect = false;
- head = null;
- }
- }
- }
- }
- public static String inputFileName(Scanner input) {
- String fileName = "\0";
- boolean isIncorrect = true;
- File tempFile;
- do {
- System.out.println("Введите путь к файлу:");
- fileName = input.nextLine();
- tempFile = new File(fileName);
- if (!tempFile.exists()) {
- System.err.println("Файл не найден!");
- } else if (!fileName.endsWith(".txt")) {
- System.err.println("Файл не текстовый!");
- } else if (!tempFile.canRead()) {
- System.err.println("Файл закрыт для чтения!");
- } else {
- isIncorrect = false;
- }
- } while (isIncorrect);
- return fileName;
- }
- static void saveToFile(String fileName, String answer){
- try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))){
- writer.write(answer + "\n");
- } catch (IOException ex){
- System.err.println("Что-то пошло не так!");
- }
- }
- static void saveOrNot(Scanner input, String answer) {
- System.out.println(CHOICE_SAVE_TEXT);
- int choice = getNumConsole(input, 1, 2);
- if (choice == 1) {
- saveToFile(inputFileName(input), answer);
- }
- }
- static boolean doFunction(Scanner input) {
- Choice choice = getChoice(input);
- boolean isClose = false;
- switch (choice) {
- case createTree -> {
- System.out.println(ATTENTION_TEXT);
- int localChoice = getNumConsole(input, 1, 2);
- if (localChoice == 1) {
- System.out.print("Введите корень дерева: ");
- int root = getNumConsole(input, MIN_NODE, MAX_NODE);
- head = createTree(root);
- }
- }
- case addElem -> {
- if (head != null) {
- System.out.println("Введите новый элемент: ");
- int newElem = getNumConsole(input, MIN_NODE, MAX_NODE);
- if (!addElem(head.root, newElem)) {
- System.err.println(ERRORS[ErrCode.SUCH_ELEMENT_ALREADY_EXIST.ordinal()]);
- }
- }
- else
- System.err.println(ERRORS[ErrCode.TREE_NOT_EXIST.ordinal()]);
- }
- case loadFormFile -> {
- boolean isNotGood = true;
- String fileName;
- do {
- fileName = inputFileName(input);
- InputListFromFile(fileName);
- if (head != null){
- isNotGood = false;
- }
- } while(isNotGood);
- }
- case print -> {
- if (head != null)
- printTree(head.root, 0, ROOT_CHAR);
- else
- System.err.println(ERRORS[ErrCode.TREE_NOT_EXIST.ordinal()]);
- System.out.println();
- }
- case checkRes -> {
- if (head != null) {
- StringBuilder answer = new StringBuilder();
- System.out.print("Вершины с разной высотой поддеревьев: ");
- checkHeight(head.root, answer);
- System.out.println(answer);
- saveOrNot(input, answer.toString());
- }
- else
- System.err.println(ERRORS[ErrCode.TREE_NOT_EXIST.ordinal()]);
- }
- case close -> isClose = true;
- }
- return isClose;
- }
- public static void main(String[] args) {
- Scanner input = new Scanner(System.in);
- printInf(input);
- boolean isClose;
- do {
- printMenu();
- isClose = doFunction(input);
- } while (!isClose);
- input.close();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement