Advertisement
gguuppyy

lab52

Apr 5th, 2024 (edited)
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.13 KB | Source Code | 0 0
  1. import java.io.*;
  2. import java.util.Scanner;
  3.  
  4. class HeadPt {
  5.     Node root;
  6.     HeadPt (Node root) {
  7.         this.root = root;
  8.     }
  9. }
  10. class Node {
  11.     int data;
  12.  
  13.     Node leftPt;
  14.     Node rightPt;
  15.     Node (int data) {
  16.         this.data = data;
  17.         this.leftPt = null;
  18.         this.rightPt = null;
  19.     }
  20. }
  21.  
  22. public class Main {
  23.  
  24.     static HeadPt head;
  25.  
  26.     enum ErrCode {
  27.         SUCCESS,
  28.         INCORRECT_DATA,
  29.         TREE_NOT_EXIST,
  30.         SUCH_ELEMENT_ALREADY_EXIST
  31.     }
  32.  
  33.     static final String[] ERRORS = {"Удача",
  34.             "Данные некорректные или число слишком большое (должно быть от %d до %d)\n",
  35.             "Сначала стоит создайте дерево!",
  36.             "Такой элемент уже существует"};
  37.  
  38.     static final String  CHOICE_SAVE_TEXT = """
  39.                        Вы хотите сохранить результат?
  40.                        1) да
  41.                        2) нет
  42.                        """;
  43.  
  44.     enum Choice {
  45.         createTree("Создать новое дерево"),
  46.         addElem("Добавить элемент"),
  47.         loadFormFile("Загрузить списки из файла"),
  48.         print("Визуализировать дерево"),
  49.         checkRes("Вывести"),
  50.         close("Закрыть");
  51.  
  52.         private final String inf;
  53.         Choice (String infLine) {
  54.             this.inf = infLine;
  55.         }
  56.         private String getInf(){return this.ordinal() + ") " + this.inf;}
  57.     }
  58.  
  59.     static final int MIN_NODE = -99999,
  60.             MAX_NODE = 99999;
  61.     static final char ROOT_CHAR = '+',
  62.             LEFT_CHAR = 'L',
  63.             RIGHT_CHAR = 'R';
  64.  
  65.     static final String INFORMATION_TEXT = """
  66.                        Инструкция:
  67.                            1) Элементы дерева должны быть от -99999 до 99999
  68.                            2) Элементы не могут повторяться
  69.                        """,
  70.             ATTENTION_TEXT = """
  71.                        Внимание! Старое дерево удалится, вы уверены?
  72.                            1) Да
  73.                            2) Нет
  74.                        """;
  75.  
  76.     static HeadPt createTree(int elem) {
  77.         Node firstNode = new Node(elem);
  78.         return new HeadPt(firstNode);
  79.     }
  80.  
  81.     static boolean addElem(Node head, int elem) {
  82.         boolean isAdded = true;
  83.         if (elem > head.data) {
  84.             if (head.rightPt != null)
  85.                 isAdded = addElem(head.rightPt, elem);
  86.             else
  87.                 head.rightPt = new Node(elem);
  88.         } else if (elem < head.data) {
  89.             if (head.leftPt != null)
  90.                 isAdded = addElem(head.leftPt, elem);
  91.             else
  92.                 head.leftPt = new Node(elem);
  93.         } else {
  94.             isAdded = false;
  95.         }
  96.         return isAdded;
  97.     }
  98.     static int getHeight(Node node) {
  99.         if (node == null)
  100.             return 0;
  101.         int leftHeight = getHeight(node.leftPt);
  102.         int rightHeight = getHeight(node.rightPt);
  103.         return Math.max(leftHeight, rightHeight) + 1;
  104.     }
  105.     static void checkHeight(Node node, StringBuilder answer) {
  106.         if (node == null)
  107.             return;
  108.         int leftHeight = getHeight(node.leftPt);
  109.         int rightHeight = getHeight(node.rightPt);
  110.         if (leftHeight != rightHeight)
  111.             answer.append(node.data + " ");
  112.         checkHeight(node.leftPt,answer);
  113.         checkHeight(node.rightPt,answer);
  114.     }
  115.  
  116.     static void printTree(Node node, int layer, char side) {
  117.         if (node.rightPt != null)
  118.             printTree(node.rightPt, layer + 1, RIGHT_CHAR);
  119.  
  120.  
  121.         for (int i = 0; i < layer; i++)
  122.             System.out.print("   ");
  123.         System.out.println("(" + side + ")" + node.data);
  124.  
  125.         if (node.leftPt != null)
  126.             printTree(node.leftPt, layer + 1, LEFT_CHAR);
  127.     }
  128.  
  129.     static void printMenu() {
  130.         Choice[] choices = Choice.values();
  131.         for (Choice choice : choices) {
  132.             System.out.println(choice.getInf());
  133.         }
  134.     }
  135.  
  136.     static void printInf(Scanner input) {
  137.         System.out.println(INFORMATION_TEXT);
  138.         System.out.println("нажмите enter чтобы продолжить");
  139.         input.nextLine();
  140.     }
  141.  
  142.     static ErrCode enterOneNum(int[] numberArr, Scanner input, final int MIN, final int MAX) {
  143.         int number = 0;
  144.         ErrCode err = ErrCode.SUCCESS;
  145.         try {
  146.             number = Integer.parseInt(input.nextLine());
  147.         } catch (NumberFormatException e) {
  148.             err = ErrCode.INCORRECT_DATA;
  149.         }
  150.         if ((err == ErrCode.SUCCESS) && (number < MIN || number > MAX))
  151.             err = ErrCode.INCORRECT_DATA;
  152.         numberArr[0] = err == ErrCode.SUCCESS ? number : 0;
  153.         return err;
  154.     }
  155.  
  156.     static int getNumConsole(Scanner input, final int MIN, final int MAX) {
  157.         ErrCode err;
  158.         int[] numberArr = {0};
  159.         do {
  160.             err = enterOneNum(numberArr, input, MIN, MAX);
  161.             if (err != ErrCode.SUCCESS) {
  162.                 System.err.printf(ERRORS[err.ordinal()], MIN, MAX);
  163.                 System.out.println("Введите снова");
  164.             }
  165.         } while (err != ErrCode.SUCCESS);
  166.         return numberArr[0];
  167.     }
  168.  
  169.     static Choice getChoice(Scanner input) {
  170.         int choice;
  171.         int maxChoice = Choice.values().length - 1;
  172.         choice = getNumConsole(input, 0, maxChoice);
  173.         return Choice.values()[choice];
  174.     }
  175.  
  176.     public static void InputListFromFile(String fileName) {
  177.         String inputedString = "";
  178.         String[] stringNums;
  179.         boolean isCorrect = true;
  180.         try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
  181.             try {
  182.                 inputedString = reader.readLine();
  183.             } catch (NumberFormatException exception) {
  184.                 isCorrect = false;
  185.                 System.err.println("Не верный тип данных. Проверьте файл.");
  186.             }
  187.         } catch (IOException ex) {
  188.             isCorrect = false;
  189.             System.err.println("Что-то пошло не так!");
  190.         }
  191.         // разделяем строки
  192.         stringNums = inputedString.split(" ");
  193.  
  194.         try {
  195.             head = createTree(Integer.parseInt(stringNums[0]));
  196.         } catch (NumberFormatException ex) {
  197.             System.err.println("Проблемы в файле!");
  198.             isCorrect = false;
  199.             head = null;
  200.         }
  201.         for (int i = 1; i < stringNums.length; i++) {
  202.             if (isCorrect) {
  203.                 try {
  204.                     addElem(head.root, Integer.parseInt(stringNums[i]));
  205.                 } catch (NumberFormatException ex) {
  206.                     System.err.println("Проблемы в файле!");
  207.                     isCorrect = false;
  208.                     head = null;
  209.                 }
  210.             }
  211.         }
  212.  
  213.     }
  214.  
  215.  
  216.     public static String inputFileName(Scanner input) {
  217.         String fileName = "\0";
  218.         boolean isIncorrect = true;
  219.         File tempFile;
  220.         do {
  221.             System.out.println("Введите путь к файлу:");
  222.             fileName = input.nextLine();
  223.             tempFile = new File(fileName);
  224.             if (!tempFile.exists()) {
  225.                 System.err.println("Файл не найден!");
  226.             } else if (!fileName.endsWith(".txt")) {
  227.                 System.err.println("Файл не текстовый!");
  228.             } else if (!tempFile.canRead()) {
  229.                 System.err.println("Файл закрыт для чтения!");
  230.             } else {
  231.                 isIncorrect = false;
  232.             }
  233.         } while (isIncorrect);
  234.         return fileName;
  235.     }
  236.  
  237.     static void saveToFile(String fileName, String answer){
  238.         try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))){
  239.             writer.write(answer + "\n");
  240.         } catch (IOException ex){
  241.             System.err.println("Что-то пошло не так!");
  242.         }
  243.     }
  244.  
  245.     static void saveOrNot(Scanner input, String answer) {
  246.         System.out.println(CHOICE_SAVE_TEXT);
  247.         int choice = getNumConsole(input, 1, 2);
  248.         if (choice == 1) {
  249.             saveToFile(inputFileName(input), answer);
  250.         }
  251.     }
  252.  
  253.     static boolean doFunction(Scanner input) {
  254.         Choice choice = getChoice(input);
  255.         boolean isClose = false;
  256.         switch (choice) {
  257.             case createTree -> {
  258.                 System.out.println(ATTENTION_TEXT);
  259.                 int localChoice = getNumConsole(input, 1, 2);
  260.                 if (localChoice == 1) {
  261.                     System.out.print("Введите корень дерева: ");
  262.                     int root = getNumConsole(input, MIN_NODE, MAX_NODE);
  263.                     head = createTree(root);
  264.                 }
  265.             }
  266.             case addElem -> {
  267.                 if (head != null) {
  268.                     System.out.println("Введите новый элемент: ");
  269.                     int newElem = getNumConsole(input, MIN_NODE, MAX_NODE);
  270.                     if (!addElem(head.root, newElem)) {
  271.                         System.err.println(ERRORS[ErrCode.SUCH_ELEMENT_ALREADY_EXIST.ordinal()]);
  272.                     }
  273.                 }
  274.                 else
  275.                     System.err.println(ERRORS[ErrCode.TREE_NOT_EXIST.ordinal()]);
  276.             }
  277.             case loadFormFile -> {
  278.                 boolean isNotGood = true;
  279.                 String fileName;
  280.                 do {
  281.                     fileName = inputFileName(input);
  282.                     InputListFromFile(fileName);
  283.                     if (head != null){
  284.                         isNotGood = false;
  285.                     }
  286.                 } while(isNotGood);
  287.             }
  288.             case print -> {
  289.                 if (head != null)
  290.                     printTree(head.root, 0, ROOT_CHAR);
  291.                 else
  292.                     System.err.println(ERRORS[ErrCode.TREE_NOT_EXIST.ordinal()]);
  293.                 System.out.println();
  294.             }
  295.             case checkRes -> {
  296.                 if (head != null) {
  297.                     StringBuilder answer = new StringBuilder();
  298.                     System.out.print("Вершины с разной высотой поддеревьев: ");
  299.                     checkHeight(head.root, answer);
  300.                     System.out.println(answer);
  301.                     saveOrNot(input, answer.toString());
  302.                 }
  303.                 else
  304.                     System.err.println(ERRORS[ErrCode.TREE_NOT_EXIST.ordinal()]);
  305.             }
  306.             case close -> isClose = true;
  307.         }
  308.         return isClose;
  309.     }
  310.  
  311.     public static void main(String[] args) {
  312.         Scanner input = new Scanner(System.in);
  313.         printInf(input);
  314.  
  315.         boolean isClose;
  316.         do {
  317.             printMenu();
  318.             isClose = doFunction(input);
  319.         } while (!isClose);
  320.         input.close();
  321.     }
  322. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement