Advertisement
THOMAS_SHELBY_18

Lab5_2 JAVA

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