Advertisement
Ewerlost

Lab5.2Java

Mar 23rd, 2024 (edited)
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 15.27 KB | None | 0 0
  1. import java.io.File;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileWriter;
  4. import java.io.IOException;
  5. import java.util.NoSuchElementException;
  6. import java.util.Scanner;
  7.  
  8. class List {
  9.     List next;
  10.     Node record;
  11.  
  12.     public List(Node record) {
  13.         this.record = record;
  14.     }
  15. }
  16. class Node {
  17.     public int data;
  18.     public Node nextLeft;
  19.     public Node nextRight;
  20.  
  21.     public Node(int n){
  22.         this.data = n;
  23.         this.nextLeft = null;
  24.         this.nextRight = null;
  25.     }
  26.  
  27. }
  28.  
  29. class Trunk {
  30.     Trunk prev;
  31.     String str;
  32.  
  33.     Trunk(Trunk prev, String str) {
  34.         this.prev = prev;
  35.         this.str = str;
  36.     }
  37. }
  38.  
  39. public class Main {
  40.     private static List reversedPath = null, leftPathList = null, rightPathList = null, normalMaxPath = null, currList = null;
  41.     private static final Scanner consoleScan = new Scanner(System.in);
  42.     static Node treeFirst = null;
  43.  
  44.     static int maxLength = 0, counter = 0;
  45.  
  46.     public static void showTrunks(Trunk trunk)
  47.     {
  48.         if (trunk == null) {
  49.             return;
  50.         }
  51.  
  52.         showTrunks(trunk.prev);
  53.         System.out.print(trunk.str);
  54.     }
  55.     public static void printTree(Node root, Trunk prev, boolean isLeft)
  56.     {
  57.         if (root == null) {
  58.             return;
  59.         }
  60.  
  61.         String prev_str = "    ";
  62.         Trunk trunk = new Trunk(prev, prev_str);
  63.  
  64.         printTree(root.nextRight, trunk, true);
  65.  
  66.         if (prev == null) {
  67.             trunk.str = "———";
  68.         }
  69.         else if (isLeft) {
  70.             trunk.str = ".———";
  71.             prev_str = "   |";
  72.         }
  73.         else {
  74.             trunk.str = "`———";
  75.             prev.str = prev_str;
  76.         }
  77.  
  78.         showTrunks(trunk);
  79.         System.out.println(" " + root.data);
  80.  
  81.         if (prev != null) {
  82.             prev.str = prev_str;
  83.         }
  84.         trunk.str = "   |";
  85.  
  86.         printTree(root.nextLeft, trunk, false);
  87.     }
  88.  
  89.     public static void outputInFile(File outputFile) {
  90.         boolean isFileIncorrect = false;
  91.         String res = treeToString(treeFirst);
  92.         res = res.substring(0,res.length() - 2);
  93.         do {
  94.             try {
  95.                 if (outputFile.isFile()) {
  96.                     if (outputFile.canWrite()) {
  97.                         try (FileWriter writer = new FileWriter(outputFile)) {
  98.                             if (treeFirst != null) {
  99.                                 writer.write(res);
  100.                             } else {
  101.                                 writer.write("Пустое дерево\n");
  102.                             }
  103.                         }
  104.                     } else {
  105.                         System.out.println("В файл не возможно записать");
  106.                         isFileIncorrect = true;
  107.                     }
  108.                 } else {
  109.                     outputFile.createNewFile();
  110.                     try (FileWriter writer = new FileWriter(outputFile)) {
  111.                         writer.write("Результат:\n");
  112.                         if (treeFirst != null) {
  113.                             writer.write(treeToString(treeFirst));
  114.                         } else {
  115.                             writer.write("Пустое дерево\n");
  116.                         }
  117.                     }
  118.                 }
  119.             } catch (IOException e) {
  120.                 System.out.println("Не удалось вывести в файл");
  121.             }
  122.         } while (isFileIncorrect);
  123.     }
  124.  
  125.  
  126.     public static boolean checkFile(File file) {
  127.         final int MIN_VALUE = 1, MAX_VALUE = 20;
  128.         int n, i;
  129.         boolean isFileIncorrect = false;
  130.         if (!file.isFile()) {
  131.             System.out.println("Файла по данному пути не существует. Пожалуйста проверьте существование файла и введите путь заново");
  132.                     isFileIncorrect = true;
  133.         }
  134.         if (!isFileIncorrect && !file.canRead()) {
  135.             System.out.println("Файл по данному пути не может быть прочитан. Пожалуйста проверьте файл и введите путь заново");
  136.                     isFileIncorrect = true;
  137.         }
  138.         if (!isFileIncorrect) {
  139.             try (Scanner fileScan = new Scanner(file)) {
  140.                 i = 0;
  141.                 while (fileScan.hasNext() && i < 20){
  142.                     n = fileScan.nextInt();
  143.                     if (n > MAX_VALUE || n < MIN_VALUE) {
  144.                         System.out.println("В файле данные выходят за пределы допустимых значений. Пожалуйста проверьте файл и введите путь заново");
  145.                                 isFileIncorrect = true;
  146.                     }
  147.                     i++;
  148.                 }
  149.                 if (!isFileIncorrect && fileScan.hasNext()) {
  150.                     System.out.println("В файле данные представлены в неправильном формате. Пожалуйста проверьте файл и введите путь заново");
  151.                             isFileIncorrect = true;
  152.                 }
  153.  
  154.             } catch (FileNotFoundException e) {
  155.                 System.out.println("Файл по данному пути не существует. Пожалуйста проверьте файл и введите путь заново");
  156.                         isFileIncorrect = true;
  157.             } catch (NoSuchElementException e) {
  158.                 System.out.println("В файле данные представлены в неправильном формате. Пожалуйста проверьте файл и введите путь заново");
  159.                         isFileIncorrect = true;
  160.             }
  161.         }
  162.         return isFileIncorrect;
  163.     }
  164.  
  165.     public static int findLongestPath(Node treeStart, List pathList) {
  166.         if (treeStart == null) {
  167.             return 0;
  168.         } else {
  169.             leftPathList = new List(null);
  170.             rightPathList = new List(null);
  171.  
  172.             int leftPathLength = findLongestPath(treeStart.nextLeft, leftPathList);
  173.             int rightPathLength = findLongestPath(treeStart.nextRight, rightPathList);
  174.  
  175.             int res;
  176.             if (leftPathLength > rightPathLength) {
  177.                 reversedPath = leftPathList;
  178.                 rightPathList = leftPathList;
  179.                 addElementToList(reversedPath, treeStart);
  180.                 res = leftPathLength + 1;
  181.             } else {
  182.                 reversedPath = rightPathList;
  183.                 leftPathList = rightPathList;
  184.                 addElementToList(reversedPath, treeStart);
  185.                 res = rightPathLength + 1;
  186.             }
  187.  
  188.             return res;
  189.         }
  190.     }
  191.  
  192.     public static String treeToString(Node treeStart){
  193.         String ans = "";
  194.         if (treeStart != null){
  195.             ans += treeStart.data + " ";
  196.             ans += treeToString(treeStart.nextLeft);
  197.             ans += treeToString(treeStart.nextRight);
  198.         }
  199.         return ans;
  200.     }
  201.     public static void inputFromFile(File file) {
  202.         int n = 0;
  203.         try (Scanner fileScan = new Scanner(file)) {
  204.             while (fileScan.hasNext()) {
  205.                 n = fileScan.nextInt();
  206.                 treeFirst = add(n, treeFirst);
  207.             }
  208.         } catch (IOException e) {
  209.             System.out.println("Не удалось считать файл");
  210.         }
  211.     }
  212.  
  213.     public static int menu() {
  214.         System.out.print("""
  215.                ______________________________________________
  216.                1.Создать пустое дерево.
  217.                2.Добавить элемент в дерево.
  218.                3.Найти максимальный путь в дереве и отзеркалить дерево относительно этого пути
  219.                4.Импортировать дерево из файла.
  220.                5.Сохранить в файл текущее дерево.
  221.                6.Закончить.
  222.                ______________________________________________
  223.                Введите номер пункта меню в который хотите попасть:
  224.                """);
  225.         return inputInt(1, 6);
  226.     }
  227.  
  228.     public static int inputInt(int min, int max) {
  229.         int num = 0;
  230.         boolean isNotCorrect;
  231.         do {
  232.             isNotCorrect = false;
  233.             System.out.print("Введите число: ");
  234.             try {
  235.                 num = Integer.parseInt(consoleScan.nextLine());
  236.             } catch (NumberFormatException e) {
  237.                 System.out.println("Вы ввели некорректные данные. Попробуйте снова.");
  238.                         isNotCorrect = true;
  239.             }
  240.             if (!isNotCorrect && (num < min || num > max)) {
  241.                 System.out.println("Введено значение не входящее в диапазон допустимых значений");
  242.                         isNotCorrect = true;
  243.             }
  244.         } while (isNotCorrect);
  245.         return num;
  246.     }
  247.  
  248.     public static Node makeEmptyNode() {
  249.         return null;
  250.     }
  251.  
  252.     public static Node get(List list, int index) {
  253.         List current = list;
  254.         for (int i = 0; i < index; i++) {
  255.             current = current.next;
  256.         }
  257.         return current.record;
  258.     }
  259.  
  260.     private static List reverseList (List list){
  261.         List reversList;
  262.  
  263.         reversList = new List(null);
  264.  
  265.         for (int i = counter; i > 0; i-- ) {
  266.             addElementToList(reversList, get(list, i));
  267.         }
  268.  
  269.         return reversList;
  270.     }
  271.  
  272.     public static void addElementToList(List pathList, Node newNode) {
  273.         List current = pathList;
  274.         while (current.next != null) {
  275.             current = current.next;
  276.         }
  277.         current.next = new List(newNode);
  278.     }
  279.     public static void swapChildren(Node treeStart) {
  280.         if (treeStart != null) {
  281.             Node temp = treeStart.nextLeft;
  282.             treeStart.nextLeft = treeStart.nextRight;
  283.             treeStart.nextRight = temp;
  284.         }
  285.     }
  286.     public static boolean isNodeInList(List list, Node treeStart){
  287.         boolean res;
  288.         res = false;
  289.         while ((list.next != null) && (!res)){
  290.             list = list.next;
  291.             if (list.record == treeStart) {
  292.                 res = true;
  293.             }
  294.         }
  295.         return res;
  296.     }
  297.     public static void mirrorTreeRelativeToPath(Node treeStart, List pathList) {
  298.         if (treeStart != null) {
  299.             mirrorTreeRelativeToPath(treeStart.nextLeft, pathList);
  300.             mirrorTreeRelativeToPath(treeStart.nextRight, pathList);
  301.  
  302.             if (isNodeInList(pathList, treeStart)) {
  303.                 swapChildren(treeStart);
  304.             }
  305.         }
  306.     }
  307.     public static Node add(int n, Node treeStart) {
  308.         if (treeStart != null) {
  309.             if (treeStart.data > n) {
  310.                 treeStart.nextLeft = add(n, treeStart.nextLeft);
  311.             } else if (treeStart.data < n) {
  312.                 treeStart.nextRight = add(n, treeStart.nextRight);
  313.             }
  314.         } else {
  315.             treeStart = new Node(n);
  316.         }
  317.         return treeStart;
  318.     }
  319.  
  320.     public static void main(String[] args) {
  321.         int choice;
  322.         System.out.println("Программа создаёт бинарное дерево.\n" + "Диапазон значений элементов дерева - от 1 до 10.");
  323.         do {
  324.             choice = menu();
  325.             switch (choice) {
  326.                 case 1:
  327.                     treeFirst = makeEmptyNode();
  328.                     printTree(treeFirst, null, false);
  329.                     break;
  330.                 case 2:
  331.                     System.out.println("Введите элемент, который хотите добавить в дерево (1-20)");
  332.                     int m = inputInt(1, 20);
  333.                     treeFirst = add(m, treeFirst);
  334.                     printTree(treeFirst, null, true);
  335.                     break;
  336.                 case 3:
  337.                     counter = findLongestPath(treeFirst, reversedPath);
  338.  
  339.                     if (counter > 0){
  340.                         System.out.println("Длина максимального пути " + counter);
  341.                         normalMaxPath = reverseList(reversedPath);
  342.                         currList = normalMaxPath;
  343.                         while (currList.next != null) {
  344.                             System.out.print(currList.next.record.data + " ");
  345.                             currList =  currList.next;
  346.                         }
  347.                         System.out.println();
  348.                         mirrorTreeRelativeToPath(treeFirst, normalMaxPath);
  349.                         printTree(treeFirst, null, true);
  350.                     } else{
  351.                         System.out.println("Максимального пути не существует");
  352.                     }
  353.                     counter = 0;
  354.                     reversedPath = null;
  355.                     normalMaxPath = null;
  356.                     break;
  357.                 case 4:
  358.                     boolean isFileIncorrect;
  359.                     String filePath;
  360.                     File inputFile;
  361.                     do {
  362.                         System.out.println("При вводе из файла убедитесь, что каждый узел дерева(1-20) записан в отдельной строке,");
  363.                         System.out.println("Введите путь к файлу с расширением");
  364.                         filePath = consoleScan.nextLine();
  365.                         inputFile = new File(filePath);
  366.                         isFileIncorrect = checkFile(inputFile);
  367.                     } while (isFileIncorrect);
  368.                     inputFromFile(inputFile);
  369.                     printTree(treeFirst, null, false);
  370.                     break;
  371.                 case 5:
  372.                     System.out.println("Введите путь к файлу с расширением");
  373.                     filePath = consoleScan.nextLine();
  374.                     File outputFile = new File(filePath);
  375.                     isFileIncorrect = false;
  376.                     if (!outputFile.isFile()) {
  377.                         System.out.println("Файла по данному пути не существует. Пожалуйста проверьте существование файла и введите путь заново");
  378.                         isFileIncorrect = true;
  379.                     }
  380.                     if (!isFileIncorrect && !outputFile.canWrite()) {
  381.                         System.out.println("Файл по данному пути не может быть перезаписан. Пожалуйста проверьте файл и введите путь заново");
  382.                         isFileIncorrect = true;
  383.                     }
  384.                     if (!isFileIncorrect) {
  385.                         outputInFile(outputFile);
  386.                     }
  387.                     break;
  388.             }
  389.         } while (choice != 6);
  390.         consoleScan.close();
  391.     }
  392. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement