Advertisement
anticlown

Lab.5.2.Full(Java)

Mar 17th, 2023 (edited)
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.45 KB | None | 0 0
  1. //Main
  2.  
  3. import java.util.Scanner;
  4. import java.io.*;
  5. import java.util.concurrent.atomic.AtomicInteger;
  6.  
  7. public class Main
  8. {
  9.     private static final int MIN_SIZE = 2;
  10.     private static final int MAX_SIZE = 10;
  11.     private static final int MIN_VALUE = -99;
  12.     private static final int MAX_VALUE = 99;
  13.     private static final Scanner scan = new Scanner(System.in);
  14.     static Tree binaryTree = new Tree();
  15.  
  16.     public static void outputTaskInfo() {
  17.         System.out.println("Данная программа находит путь максимальной длины в бинарном дереве" + "\n" +
  18.                 "между вершинами с разным числом потомков." + "\n" +
  19.                 "Диапазон ввода значений размера последовательности: " + MIN_SIZE + "..." + MAX_SIZE + ". \n" +
  20.                 "Диапазон для ввода чисел: " + MIN_VALUE + "..." +  MAX_VALUE + ". \n" +
  21.                 "При подсчете максимального пути все ребра являются равновесными и равны 1.");
  22.     }
  23.  
  24.     public static int getVerificationOfChoice() {
  25.         int choice = 0;
  26.         boolean isIncorrect;
  27.  
  28.         do {
  29.             isIncorrect = false;
  30.             try {
  31.                 choice = Integer.parseInt(scan.nextLine());
  32.             } catch (NumberFormatException e) {
  33.                 System.out.println("Проверьте корректность ввода данных!");
  34.                 isIncorrect = true;
  35.             }
  36.             if (!isIncorrect && (choice != 0 && choice != 1)) {
  37.                 System.out.println("Для выбора введите 0 или 1!");
  38.                 isIncorrect = true;
  39.             }
  40.         } while (isIncorrect);
  41.  
  42.         return choice;
  43.     }
  44.  
  45.     public static String inputPathToFile() {
  46.         boolean isIncorrect;
  47.         String path;
  48.  
  49.         System.out.println("Укажите путь к файлу: ");
  50.  
  51.         do {
  52.             isIncorrect = false;
  53.             path = scan.nextLine();
  54.             File file = new File(path);
  55.  
  56.             if (!file.exists()) {
  57.                 System.out.println("По указанному пути файл не найден! Укажите правильный путь: ");
  58.                 isIncorrect = true;
  59.             }
  60.         } while (isIncorrect);
  61.  
  62.         return path;
  63.     }
  64.  
  65.     public static int readSizeFromConsole(){
  66.         int size = 0;
  67.         boolean isIncorrect;
  68.  
  69.         System.out.println("Введите количество элементов дерева: ");
  70.  
  71.         do {
  72.             isIncorrect = false;
  73.             try {
  74.                 size = Integer.parseInt(scan.nextLine());
  75.             } catch (NumberFormatException e) {
  76.                 System.out.println("Проверьте корректность ввода данных!");
  77.                 isIncorrect = true;
  78.             }
  79.             if (!isIncorrect && (size < MIN_SIZE || size > MAX_SIZE)) {
  80.                 System.out.println("Введите число от " + MIN_SIZE + " до " + MAX_SIZE + "! \n");
  81.                 isIncorrect = true;
  82.             }
  83.         } while (isIncorrect);
  84.  
  85.         return size;
  86.     }
  87.  
  88.     public static int readSizeFromFile(final String path) {
  89.         int size;
  90.  
  91.         System.out.println("Происходит чтение количества элементов дерева... ");
  92.  
  93.         try (BufferedReader br = new BufferedReader(new FileReader(path))) {
  94.             size = Integer.parseInt(br.readLine());
  95.         } catch (Exception e) {
  96.             System.out.println("Ошибка при чтении данных! Введите количество с консоли!");
  97.             size = readSizeFromConsole();
  98.         }
  99.  
  100.         return size;
  101.     }
  102.  
  103.     public static void outputSizeInConsole(int size) {
  104.         System.out.println("Количество элементов дерева равно: " + size + ".");
  105.     }
  106.  
  107.     public static void outputSizeInFile(int size, String path) {
  108.         boolean isIncorrect;
  109.         System.out.println("Вывод количества элементов дерева в файл...");
  110.  
  111.         do {
  112.             isIncorrect = false;
  113.             try {
  114.                 FileWriter writer = new FileWriter(path);
  115.                 writer.write("Количесство элементов дерева: " + size + "\n");
  116.                 writer.close();
  117.             } catch (IOException e) {
  118.                 isIncorrect = true;
  119.                 System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!");
  120.                 path = inputPathToFile();
  121.             }
  122.         } while (isIncorrect);
  123.  
  124.         System.out.println("Данные успешно записаны в файл!");
  125.     }
  126.  
  127.     public static int[] fillSequenceFromConsole(final int size) {
  128.         int[] sequence = new int[size];
  129.         boolean isIncorrect;
  130.  
  131.         for (int i = 0; i < size; i++) {
  132.             System.out.print("Введите значение " + (i + 1) + "-го элемента: ");
  133.  
  134.             do {
  135.                 isIncorrect = false;
  136.                 try {
  137.                     sequence[i] = Integer.parseInt(scan.nextLine());
  138.                 } catch (NumberFormatException e) {
  139.                     System.out.println("Проверьте корректность ввода данных!");
  140.                     isIncorrect = true;
  141.                 }
  142.  
  143.                 if (!isIncorrect && (sequence[i] < MIN_VALUE || sequence[i] > MAX_VALUE)) {
  144.                     isIncorrect = true;
  145.                     System.out.println("Введите число от " + MIN_VALUE + " до " + MAX_VALUE + "!");
  146.                 }
  147.             } while (isIncorrect);
  148.         }
  149.  
  150.         return sequence;
  151.     }
  152.  
  153.     public static int[] fillSequenceFromFile(final int size, final String path) {
  154.         int[] sequence = new int[size];
  155.         System.out.println("Происходит чтение последовательности элементов...");
  156.  
  157.         try (BufferedReader fReader = new BufferedReader(new FileReader(path))){
  158.             fReader.readLine();
  159.             String[] integerInString = fReader.readLine().split(" ");
  160.             for (int j = 0; j < size; j++)
  161.                 sequence[j] = Integer.parseInt(integerInString[j]);
  162.         } catch (Exception e) {
  163.             System.out.println("Ошибка при чтении последовательности! Введите последовательность с консоли!");
  164.             sequence = fillSequenceFromConsole(size);
  165.         }
  166.         for (int j = 0; j < size; j++) {
  167.             if (sequence[j] < MIN_VALUE || sequence[j] > MAX_VALUE) {
  168.                 System.out.println("Ошибка при считывании последовательности из файла!\nВведите последовательности с консоли!");
  169.                 sequence = fillSequenceFromConsole(size);
  170.             }
  171.         }
  172.  
  173.         return sequence;
  174.     }
  175.  
  176.     public static void outputSequenceInConsole(final int[] sequence, final int size) {
  177.         System.out.println("Вывод начальной последовательности элементов: ");
  178.         for (int i = 0; i < size; i++)
  179.             System.out.print(sequence[i] + " ");
  180.         System.out.print("\n");
  181.     }
  182.  
  183.     public static void outputSequenceInFile(String path, final int[] sequence, final int size){
  184.         boolean isIncorrect;
  185.         System.out.println("Вывод начальной последовательности элементов в файл...");
  186.  
  187.         do {
  188.             isIncorrect = false;
  189.             try {
  190.                 FileWriter writer = new FileWriter(path, true);
  191.                 BufferedWriter bufferWriter = new BufferedWriter(writer);
  192.  
  193.                 bufferWriter.write("Начальная последовательность: ");
  194.                 for (int i = 0; i < size; i++)
  195.                     bufferWriter.write(sequence[i] + " ");
  196.                 bufferWriter.write("\n");
  197.  
  198.                 bufferWriter.close();
  199.                 writer.close();
  200.             } catch (IOException e) {
  201.                 isIncorrect = true;
  202.                 System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!");
  203.                 path = inputPathToFile();
  204.             }
  205.         } while (isIncorrect);
  206.  
  207.         System.out.println("Данные успешно записаны в файл!");
  208.     }
  209.  
  210.     private static void CreateTree(Tree tree, final int[] sequence) {
  211.         for (int j : sequence) {
  212.             tree.insertNode(j);
  213.         }
  214.     }
  215.  
  216.     public static int findMaxSumPath(Node root, AtomicInteger max_sum)
  217.     {
  218.         if (root == null) {
  219.             return 0;
  220.         }
  221.  
  222.         int left = findMaxSumPath(root.left, max_sum);
  223.  
  224.         int right = findMaxSumPath(root.right, max_sum);
  225.  
  226.         if (root.left == null) {
  227.             return right + 1;
  228.         }
  229.  
  230.         if (root.right == null) {
  231.             return left + 1;
  232.         }
  233.  
  234.         int cur_sum = left + right + 1;
  235.  
  236.         max_sum.set(Math.max(cur_sum, max_sum.get()));
  237.  
  238.         return Math.max(left, right) + 1;
  239.     }
  240.  
  241.     public static int countNodes(Node root, int counter) {
  242.         if (root != null) {
  243.             counter = countNodes(root.left, counter) + 1 + countNodes(root.right, counter);
  244.         }
  245.         return counter;
  246.     }
  247.     public static int findMaxWay(Node root)
  248.     {
  249.         AtomicInteger max_sum = new AtomicInteger(Integer.MIN_VALUE);
  250.         findMaxSumPath(root, max_sum);
  251.  
  252.         if (max_sum.get() != Integer.MIN_VALUE) {
  253.             return max_sum.get() - 2;
  254.         } else {
  255.             return countNodes(root, 0) - 1;
  256.         }
  257.     }
  258.  
  259.     public static void outputMaxLengthInConsole(int maxLength) {
  260.         System.out.println("Длина максимального пути равна: " + maxLength + ".");
  261.     }
  262.  
  263.     public static void outputMaxLengthInFile(String path, int maxLength) {
  264.         boolean isIncorrect;
  265.         System.out.println("Вывод длины максимального пути в файл...");
  266.  
  267.         do {
  268.             isIncorrect = false;
  269.             try {
  270.                 FileWriter writer = new FileWriter(path, true);
  271.                 writer.write("Максимальный путь: " + maxLength + "\n");
  272.                 writer.close();
  273.             } catch (IOException e) {
  274.                 isIncorrect = true;
  275.                 System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!");
  276.                 path = inputPathToFile();
  277.             }
  278.         } while (isIncorrect);
  279.  
  280.         System.out.println("Данные успешно записаны в файл!");
  281.     }
  282.  
  283.     public static int[] processUserInput() {
  284.         int size;
  285.         int[] sequence = new int[0];
  286.         int choiceForInput;
  287.         String pathToIn;
  288.  
  289.         System.out.println("Вы желаете ввести данные с консоли(0) или взять данные из файла(1)?");
  290.         choiceForInput = getVerificationOfChoice();
  291.  
  292.         if (choiceForInput == 0) {
  293.             size = readSizeFromConsole();
  294.             sequence = fillSequenceFromConsole(size);
  295.         }
  296.         if (choiceForInput == 1) {
  297.             pathToIn = inputPathToFile();
  298.             size = readSizeFromFile(pathToIn);
  299.             sequence = fillSequenceFromFile(size, pathToIn);
  300.         }
  301.  
  302.         return sequence;
  303.     }
  304.  
  305.     public static void processUserOutput(final int size, final int[] sequence, final int maxLength) {
  306.         int choiceForOutput;
  307.         String pathToOut;
  308.  
  309.         System.out.println("Вы желаете получить результат в консоли(0) или в файле(1)?");
  310.         choiceForOutput = getVerificationOfChoice();
  311.  
  312.         if (choiceForOutput == 0) {
  313.             outputSizeInConsole(size);
  314.             outputSequenceInConsole(sequence, size);
  315.             outputMaxLengthInConsole(maxLength);
  316.         }
  317.         if (choiceForOutput == 1) {
  318.             pathToOut = inputPathToFile();
  319.             outputSizeInFile(size, pathToOut);
  320.             outputSequenceInFile(pathToOut, sequence, size);
  321.             outputMaxLengthInFile(pathToOut, maxLength);
  322.         }
  323.     }
  324.  
  325.     public static void main(String[] args)
  326.     {
  327.         outputTaskInfo();
  328.         int[] sequence = processUserInput();
  329.         CreateTree(binaryTree, sequence);
  330.         int maxLength = findMaxWay(binaryTree.root);
  331.         processUserOutput(sequence.length, sequence, maxLength);
  332.  
  333.         scan.close();
  334.     }
  335. }
  336.  
  337. //Tree
  338.  
  339. class Tree {
  340.     public Node root;
  341.  
  342.     public Tree() {
  343.         root = null;
  344.     }
  345.  
  346.     public void insertNode(int value) {
  347.         Node newNode = new Node();
  348.         newNode.setValue(value);
  349.         if (root == null) {
  350.             root = newNode;
  351.         } else {
  352.             Node currentNode = root;
  353.             Node parentNode;
  354.             while (true) {
  355.                 parentNode = currentNode;
  356.                 if (value == currentNode.getValue()) {
  357.                     return;
  358.                 } else if (value < currentNode.getValue()) {
  359.                     currentNode = currentNode.getLeft();
  360.                     if (currentNode == null) {
  361.                         parentNode.setLeft(newNode);
  362.                         return;
  363.                     }
  364.                 } else {
  365.                     currentNode = currentNode.getRight();
  366.                     if (currentNode == null) {
  367.                         parentNode.setRight(newNode);
  368.                         return;
  369.                     }
  370.                 }
  371.             }
  372.         }
  373.     }
  374. }
  375.  
  376. //Node
  377.  
  378. class Node {
  379.     public int data;
  380.     public Node left;
  381.     public Node right;
  382.  
  383.     public Node() {
  384.         right = null;
  385.         left = null;
  386.     }
  387.     public int getValue() {
  388.         return this.data;
  389.     }
  390.  
  391.     public void setValue(final int value) {
  392.         this.data = value;
  393.     }
  394.  
  395.     public Node getLeft() {
  396.         return this.left;
  397.     }
  398.  
  399.     public void setLeft(final Node leftChild) {
  400.         this.left = leftChild;
  401.     }
  402.  
  403.     public Node getRight() {
  404.         return this.right;
  405.     }
  406.  
  407.     public void setRight(final Node rightChild) {
  408.         this.right = rightChild;
  409.     }
  410. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement