Advertisement
Vernon_Roche

Лабораторная работа 5.2 Java

Mar 20th, 2024
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 23.52 KB | None | 0 0
  1. package com.example.lab5_2;
  2.  
  3. import java.io.*;
  4. import java.util.Scanner;
  5.  
  6. public class Main {
  7.     public static Scanner scan = new Scanner(System.in);
  8.     final static int A_MAKE_EMPTY_TREE = 1,
  9.                      A_ADD_NODE = 2,
  10.                      A_DELETE_NODE = 3,
  11.                      A_SHOW_TREE = 4,
  12.                      A_SHOW_IN_ORDER = 5,
  13.                      A_INSERT_SUBTREE = 6,
  14.                      A_OPEN = 7,
  15.                      A_SAVE = 8,
  16.                      A_EXIT = 9,
  17.                      A_INSERT = 5,
  18.                      A_SUBTREE_EXIT = 5,
  19.                      INPUT = 1,
  20.                      OUTPUT = 2,
  21.                      MIN_VAL = 1,
  22.                      MAX_VAL = 1000000;
  23.     public static void main(String[] args) {
  24.         Tree tree = new Tree();
  25.         processTree(tree);
  26.         scan.close();
  27.     }
  28.  
  29.     private static void processTree(Tree tree) {
  30.         int action;
  31.         do {
  32.             action = inputAction();
  33.             performAction(action, tree);
  34.         } while (action != A_EXIT);
  35.     }
  36.  
  37.     private static void performAction(int action, Tree tree) {
  38.         switch (action) {
  39.             case A_MAKE_EMPTY_TREE:
  40.                 makeEmptyTree(tree);
  41.                 break;
  42.             case A_ADD_NODE:
  43.                 addNode(tree);
  44.                 break;
  45.             case A_DELETE_NODE:
  46.                 deleteNode(tree);
  47.                 break;
  48.             case A_SHOW_TREE:
  49.                 showTree(tree);
  50.                 break;
  51.             case A_SHOW_IN_ORDER:
  52.                 showTreeInOrder(tree);
  53.                 break;
  54.             case A_INSERT_SUBTREE:
  55.                 insertSubtree(tree);
  56.                 break;
  57.             case A_OPEN:
  58.                 openFile(tree);
  59.                 break;
  60.             case A_SAVE:
  61.                 saveInFile(tree);
  62.                 break;
  63.             case A_EXIT:
  64.                 break;
  65.         }
  66.     }
  67.  
  68.     private static void saveInFile(Tree tree) {
  69.         boolean isFileCorrect;
  70.         String filePath;
  71.         filePath = inputFilePath(OUTPUT);
  72.         saveTree(tree, filePath);
  73.         System.out.println("\nДерево успешно сохранено.");
  74.     }
  75.  
  76.     private static void saveTree(Tree tree, String filePath) {
  77.         try (FileWriter fileWriter = new FileWriter(filePath)) {
  78.             tree.printTreeInFile(fileWriter);
  79.         } catch (IOException e) {
  80.             System.out.println("\nОшибка! Невозможно открыть файл.");
  81.         }
  82.     }
  83.  
  84.     private static void openFile(Tree tree) {
  85.         boolean isFileCorrect;
  86.         String filePath;
  87.         do {
  88.             filePath = inputFilePath(INPUT);
  89.             isFileCorrect = isFileCorrect(filePath);
  90.         } while (!isFileCorrect);
  91.         tree.makeEmptyTree();
  92.         inputFromFile(filePath, tree);
  93.     }
  94.  
  95.     private static void inputFromFile(String filePath, Tree inputTree) {
  96.         int newVal;
  97.         try (Scanner fileScanner = new Scanner(new FileReader(filePath))) {
  98.             while (fileScanner.hasNext()) {
  99.                 newVal = Integer.parseInt(fileScanner.next());
  100.                 inputTree.insertNode(newVal);
  101.             }
  102.             fileScanner.close();
  103.         } catch (FileNotFoundException e) {
  104.             System.out.println("\nОшибка! Невозможно открыть файл.");
  105.         }
  106.     }
  107.  
  108.     private static void insertSubtree(Tree tree) {
  109.         int insertVal;
  110.         boolean isLeafNode;
  111.         Tree subtree = new Tree();
  112.         System.out.println("\nВведите листовую вершину, в которую хотите вставить поддерево:");
  113.         do {
  114.             insertVal = inputNum(MIN_VAL, MAX_VAL);
  115.             isLeafNode = tree.isLeafNode(insertVal, tree.rootNode);
  116.             if (!isLeafNode)
  117.                 System.out.println("\nДанное значение не является листовой вершиной. Повторите ввод:");
  118.         } while (!isLeafNode);
  119.         processSubtree(subtree, insertVal, tree);
  120.  
  121.     }
  122.  
  123.     private static void processSubtree(Tree subtree, int insertVal, Tree tree) {
  124.         int subtreeAction;
  125.         do {
  126.             subtreeAction = inputSubtreeAction();
  127.             performSubtreeAction(subtreeAction, subtree, insertVal, tree);
  128.         } while (subtreeAction != A_SUBTREE_EXIT);
  129.     }
  130.  
  131.     public static int inputSubtreeAction() {
  132.         System.out.print("\n______________________________________________ \n1.Создать пустое дерево. \n2.Добавить элемент в дерево. \n3.Удалить элемент из дерева.\n4.Вывести дерево.\n5.Выйти. \n______________________________________________ \nВыберите действие: ");
  133.         return inputNum(A_MAKE_EMPTY_TREE, A_SUBTREE_EXIT);
  134.     }
  135.  
  136.     private static void performSubtreeAction(int subtreeAction, Tree subtree, int insertVal, Tree tree) {
  137.         switch (subtreeAction) {
  138.             case A_MAKE_EMPTY_TREE:
  139.                 makeEmptyTree(subtree);
  140.                 break;
  141.             case A_ADD_NODE:
  142.                 addNodeInSubtree(subtree, tree);
  143.                 break;
  144.             case A_DELETE_NODE:
  145.                 deleteNode(subtree);
  146.                 break;
  147.             case A_SHOW_TREE:
  148.                 showTree(subtree);
  149.                 break;
  150.             case A_SUBTREE_EXIT:
  151.                 insertSubtreeInTree(insertVal, subtree, tree);
  152.                 break;
  153.         }
  154.     }
  155.  
  156.     private static void insertSubtreeInTree(int insertVal, Tree subtree, Tree tree) {
  157.         tree.insertSubtree(insertVal, subtree);
  158.         System.out.println("\nДерево успешно вставлено.");
  159.     }
  160.  
  161.     private static void addNodeInSubtree(Tree subtree, Tree tree) {
  162.         int newValue;
  163.         boolean isCorrect;
  164.         System.out.println("\nВведите значение, которое хотите добавить [1; 1000000]:");
  165.         do {
  166.             isCorrect = true;
  167.             newValue = inputNum(MIN_VAL, MAX_VAL);
  168.             if (tree.findNode(newValue, tree.rootNode) != null) {
  169.                 System.out.println("\nОшибка! Данное значение присутствует в исходном дереве, добавление невозможно. Повторите ввод:");
  170.                 isCorrect = false;
  171.             }
  172.         } while (!isCorrect);
  173.         subtree.insertNode(newValue);
  174.         System.out.println("\nУспешно добавлено.");
  175.     }
  176.  
  177.     private static void showTreeInOrder(Tree tree) {
  178.         tree.printTreeInOrder();
  179.     }
  180.  
  181.     private static void showTree(Tree tree) {
  182.         tree.printTree();
  183.     }
  184.  
  185.     private static void makeEmptyTree(Tree tree) {
  186.         tree.makeEmptyTree();
  187.         System.out.println("\nПустое дерево успешно создано.");
  188.     }
  189.  
  190.     private static void deleteNode(Tree tree) {
  191.         int delValue;
  192.         System.out.println("\nВведите значение, которое хотите удалить [1; 1000000]:");
  193.         delValue = inputNum(MIN_VAL, MAX_VAL);
  194.         tree.delete(delValue);
  195.         System.out.println("\nУспешно удалено.");
  196.     }
  197.  
  198.     private static void addNode(Tree tree) {
  199.         int newValue;
  200.         System.out.println("\nВведите значение, которое хотите добавить [1; 1000000]:");
  201.         newValue = inputNum(MIN_VAL, MAX_VAL);
  202.         tree.insertNode(newValue);
  203.         System.out.println("\nУспешно добавлено.");
  204.     }
  205.  
  206.     public static int chooseElem(Tree tree) {
  207.         boolean isCorrect;
  208.         int num;
  209.         String strValues = tree.treeToString(tree.rootNode);
  210.         String[] values = strValues.split(" ");
  211.         do {
  212.             System.out.println("Выберите элемент дерева:");
  213.             isCorrect = false;
  214.             num = inputNum(1, 10);
  215.             for (int i = 0; i < values.length; i++)
  216.                 if (num == Integer.parseInt(values[i]))
  217.                     isCorrect = true;
  218.             if (!isCorrect)
  219.                 System.out.println("Введенный элемент отсутствует в дереве.");
  220.         } while (!isCorrect);
  221.         return num;
  222.     }
  223.  
  224.     public static int inputAction() {
  225.         System.out.print("\n______________________________________________ \n1.Создать пустое дерево. \n2.Добавить элемент в дерево. \n3.Удалить элемент из дерева.\n4.Вывести дерево.\n5.Просмотреть дерево в порядке: узел, левая ветвь, правая ветвь.\n6.Вставить поддерево. \n7.Импортировать дерево из файла. \n8.Сохранить в файл текущее дерево. \n9.Выйти. \n______________________________________________ \nВыберите действие: ");
  226.         return inputNum(A_MAKE_EMPTY_TREE, A_EXIT);
  227.     }
  228.  
  229.     public static void writeTask(){
  230.         System.out.println("Данная программа указывает место вставки указанного элемента из массива в двоичном дереве поиска.");
  231.     }
  232.  
  233.     public static int inputNum(final int MIN_LIM, final int MAX_LIM) {
  234.         int num = 0;
  235.         boolean isIncorrect;
  236.         do {
  237.             isIncorrect = false;
  238.             try {
  239.                 num = Integer.parseInt(scan.nextLine());
  240.             } catch (NumberFormatException ex) {
  241.                 System.out.print("Ошибка! Введенное значение должно быть числом!\nПовторите ввод: ");
  242.                 isIncorrect = true;
  243.             }
  244.             if (!isIncorrect && (num < MIN_LIM || num > MAX_LIM)) {
  245.                 System.out.print("Ошибка! Введенное значение должно быть натуральным числом от " + MIN_LIM + " до " + MAX_LIM + "!\nПовторите ввод: ");
  246.                 isIncorrect = true;
  247.             }
  248.         } while (isIncorrect);
  249.         return num;
  250.     }
  251.  
  252.     public static String inputFilePath(final int TYPE_OF_PATH) {
  253.         boolean isIncorrect;
  254.         String path;
  255.         if (TYPE_OF_PATH == INPUT)
  256.             System.out.print("\nВведите путь к файлу для ввода данных: ");
  257.         else if (TYPE_OF_PATH == OUTPUT)
  258.             System.out.print("\nВведите путь к файлу для вывода данных: ");
  259.         do {
  260.             isIncorrect = false;
  261.             path = scan.nextLine();
  262.             File file = new File(path);
  263.             if (TYPE_OF_PATH == INPUT) {
  264.                 if (!file.exists()) {
  265.                     System.out.print("Ошибка! Данный файл не найден! Введите корректный путь к файлу и повторите попытку: ");
  266.                     isIncorrect = true;
  267.                 }
  268.                 if (!isIncorrect && !path.endsWith(".txt")) {
  269.                     System.out.print("Ошибка! Файл должен иметь расширение .txt! Корректный путь к файлу:");
  270.                     isIncorrect = true;
  271.                 }
  272.             }
  273.         } while (isIncorrect);
  274.         return path;
  275.     }
  276.  
  277.     public static boolean isFileCorrect(String path) {
  278.         boolean isIncorrect;
  279.         int newVal;
  280.         isIncorrect = false;
  281.         String strValues = "";
  282.         int nodeCount;
  283.         try (Scanner fileScanner = new Scanner(new FileReader(path))) {
  284.             while (fileScanner.hasNext())
  285.                 newVal = Integer.parseInt(fileScanner.next());
  286.             fileScanner.close();
  287.         } catch (NumberFormatException ex) {
  288.             System.out.println("\nОшибка! В файле данные введены не по формату!");
  289.             isIncorrect = true;
  290.         } catch (FileNotFoundException e) {
  291.             System.out.println("\nОшибка! Невозможно открыть файл.");
  292.         }
  293.         return !isIncorrect;
  294.     }
  295. }
  296.  
  297. package com.example.lab5_2;
  298.  
  299. import java.io.FileWriter;
  300. import java.io.IOException;
  301. import java.util.Stack;
  302.  
  303. public class Tree {
  304.     public Node rootNode;
  305.  
  306.     public Tree() {
  307.         rootNode = null;
  308.     }
  309.  
  310.     public void insertNode(int value) {
  311.         Node newNode = new Node();
  312.         newNode.value = value;
  313.         if (rootNode == null) {
  314.             rootNode = newNode;
  315.         } else {
  316.             Node currentNode = rootNode;
  317.             Node parentNode;
  318.             while (true) {
  319.                 parentNode = currentNode;
  320.                 if (value == currentNode.value) {
  321.                     return;
  322.                 } else if (value < currentNode.value) {
  323.                     currentNode = currentNode.leftChild;
  324.                     if (currentNode == null) {
  325.                         parentNode.leftChild = newNode;
  326.                         return;
  327.                     }
  328.                 } else {
  329.                     currentNode = currentNode.rightChild;
  330.                     if (currentNode == null) {
  331.                         parentNode.rightChild = newNode;
  332.                         return;
  333.                     }
  334.                 }
  335.             }
  336.         }
  337.     }
  338.  
  339.     public void printTree() {
  340.         Stack globalStack = new Stack();
  341.         globalStack.push(rootNode);
  342.         int gaps = (int) Math.pow(2, findMaxDepth(rootNode));
  343.         boolean isRowEmpty = false;
  344.         String separator = "-----------------------------------------------------------------";
  345.         System.out.println(separator);
  346.         while (!isRowEmpty) {
  347.             Stack localStack = new Stack();
  348.             isRowEmpty = true;
  349.             for (int j = 0; j < gaps; j++)
  350.                 System.out.print(' ');
  351.             while (!globalStack.isEmpty()) {
  352.                 Node temp = (Node) globalStack.pop();
  353.                 if (temp != null) {
  354.                     System.out.print(temp.value);
  355.                     localStack.push(temp.leftChild);
  356.                     localStack.push(temp.rightChild);
  357.                     if (temp.leftChild != null || temp.rightChild != null)
  358.                         isRowEmpty = false;
  359.                 } else {
  360.                     System.out.print("__");
  361.                     localStack.push(null);
  362.                     localStack.push(null);
  363.                 }
  364.                 for (int j = 0; j < gaps * 2 - 2; j++)
  365.                     System.out.print(' ');
  366.             }
  367.             System.out.println();
  368.             gaps /= 2;
  369.             while (!localStack.isEmpty())
  370.                 globalStack.push(localStack.pop());
  371.         }
  372.         System.out.println(separator);
  373.     }
  374.  
  375.     public void printTreeInOrder() {
  376.         Stack globalStack = new Stack();
  377.         globalStack.push(rootNode);
  378.         int gaps = (int) Math.pow(2, findMaxDepth(rootNode));
  379.         boolean isRowEmpty = false;
  380.         String separator = "-----------------------------------------------------------------";
  381.         System.out.println(separator);
  382.         while (!isRowEmpty) {
  383.             Stack localStack = new Stack();
  384.             isRowEmpty = true;
  385.             for (int j = 0; j < gaps; j++)
  386.                 System.out.print(' ');
  387.             while (!globalStack.isEmpty()) {
  388.                 Node temp = (Node) globalStack.pop();
  389.                 if (temp != null) {
  390.                     System.out.print(temp.value);
  391.                     try {
  392.                         Thread.sleep(1000);
  393.                     } catch (InterruptedException e) {
  394.                         System.out.println("\nОшибка вывода дерева.");
  395.                     }
  396.                     localStack.push(temp.leftChild);
  397.                     localStack.push(temp.rightChild);
  398.                     if (temp.leftChild != null || temp.rightChild != null)
  399.                         isRowEmpty = false;
  400.                 } else {
  401.                     System.out.print("__");
  402.                     localStack.push(null);
  403.                     localStack.push(null);
  404.                 }
  405.                 for (int j = 0; j < gaps * 2 - 2; j++)
  406.                     System.out.print(' ');
  407.             }
  408.             System.out.println();
  409.             gaps /= 2;
  410.             while (!localStack.isEmpty())
  411.                 globalStack.push(localStack.pop());
  412.         }
  413.         System.out.println(separator);
  414.     }
  415.  
  416.     private int findMaxDepth(Node node) {
  417.         int depthL, depthR;
  418.         int maxDepth;
  419.         if (node == null)
  420.             maxDepth = 0;
  421.         else {
  422.             depthR = findMaxDepth(node.rightChild);
  423.             depthL = findMaxDepth(node.leftChild);
  424.             if (depthR > depthL)
  425.                 maxDepth = depthR + 1;
  426.             else
  427.                 maxDepth = depthL + 1;
  428.         }
  429.         return maxDepth;
  430.     }
  431.  
  432.     public int getHeight(Node root) {
  433.         if (root == null) {
  434.             return 0;
  435.         }
  436.  
  437.         return 1 + Math.max(getHeight(root.leftChild), getHeight(root.rightChild));
  438.     }
  439.  
  440.     public String treeToString(Node node) {
  441.         String ans = "";
  442.         if (node != null) {
  443.             ans += treeToString(node.leftChild);
  444.             ans += node.value + " ";
  445.             ans += treeToString(node.rightChild);
  446.         }
  447.         return ans;
  448.     }
  449.  
  450.     public void makeEmptyTree() {
  451.  
  452.         rootNode = null;
  453.     }
  454.  
  455.     public void delete(int n) {
  456.         Node deleteNode, minRightNode;
  457.         int minValue;
  458.         deleteNode = findNode(n, rootNode);
  459.         if (deleteNode == null)
  460.             System.out.println("\nЭлемент отсутствует в дереве, удаление невозможно.");
  461.         else if ((deleteNode.rightChild == null) || (deleteNode.leftChild == null))
  462.             if (deleteNode == rootNode) {
  463.                 if (rootNode.rightChild != null)
  464.                     rootNode = rootNode.rightChild;
  465.                 else if (rootNode.leftChild != null)
  466.                     rootNode = rootNode.leftChild;
  467.                 else
  468.                     rootNode = null;
  469.             }
  470.             else
  471.                 delWithoutTwoDes(deleteNode, rootNode);
  472.         else {
  473.             minRightNode = findNodeMin(deleteNode.rightChild);
  474.             minValue = minRightNode.value;
  475.             delWithoutTwoDes(minRightNode, rootNode);
  476.             deleteNode.value = minValue;
  477.         }
  478.     }
  479.  
  480.     private Node findNodeMin(Node node) {
  481.         Node resultNode;
  482.         resultNode = node;
  483.         if ((node.rightChild != null) || (node.leftChild != null))//мен
  484.             resultNode = findMin(node, resultNode);
  485.         return resultNode;
  486.     }
  487.  
  488.     private Node findMin(Node node, Node nodeMin) {
  489.         if (node.leftChild != null) {
  490.             if (node.leftChild.value < nodeMin.value)
  491.                 nodeMin = node.leftChild;
  492.             nodeMin = findMin(node.leftChild, nodeMin);
  493.         }
  494.         return nodeMin;
  495.     }
  496.  
  497.     private void delWithoutTwoDes(Node deleteNode, Node rootNode) {
  498.         if ((rootNode.rightChild != null) && (rootNode.rightChild.value == deleteNode.value)) {
  499.             if (rootNode.rightChild.rightChild != null)
  500.                 rootNode.rightChild = rootNode.rightChild.rightChild;
  501.             else if (rootNode.rightChild.leftChild != null)
  502.                 rootNode.rightChild = rootNode.rightChild.leftChild;
  503.             else
  504.                 rootNode.rightChild = null;
  505.         }
  506.         else if ((rootNode.leftChild != null) && (rootNode.leftChild.value == deleteNode.value)) {
  507.             if (rootNode.leftChild.rightChild != null)
  508.                 rootNode.leftChild = rootNode.leftChild.rightChild;
  509.             else if (rootNode.leftChild.leftChild != null)
  510.                 rootNode.leftChild = rootNode.leftChild.leftChild;
  511.             else
  512.                 rootNode.leftChild = null;
  513.         }
  514.         else {
  515.             if (rootNode.rightChild != null)
  516.                 delWithoutTwoDes(deleteNode, rootNode.rightChild);
  517.             if ((rootNode.leftChild != null) && (deleteNode != null))
  518.                 delWithoutTwoDes(deleteNode, rootNode.leftChild);
  519.             }
  520.         }
  521.  
  522.     public Node findNode(int n, Node node) {
  523.         Node resultNode;
  524.         resultNode = null;
  525.         if (node == null) {
  526.             node = null;
  527.         } else if (node.value == n)
  528.             resultNode = node;
  529.         else if (node.rightChild != null) {
  530.             resultNode = findNode(n, node.rightChild);
  531.             if (resultNode == null)
  532.                 resultNode = findNode(n, node.leftChild);
  533.         } else if (node.leftChild != null)
  534.             resultNode = findNode(n, node.leftChild);
  535.         return resultNode;
  536.     }
  537.  
  538.     public boolean isLeafNode(int checkedNode, Node root) {
  539.         boolean isLeaf;
  540.         if ((root.rightChild == null) && (root.leftChild == null)) {
  541.             if (root.value == checkedNode)
  542.                 isLeaf = true;
  543.             else
  544.                 isLeaf = false;
  545.         } else if ((root.rightChild != null) && (root.value < checkedNode))
  546.             isLeaf = isLeafNode(checkedNode, root.rightChild);
  547.         else if ((root.leftChild != null) && (root.value > checkedNode))
  548.             isLeaf = isLeafNode(checkedNode, root.leftChild);
  549.         else
  550.             isLeaf = false;
  551.         return isLeaf;
  552.     }
  553.  
  554.     public void insertSubtree(int insertVal, Tree subtree) {
  555.         Node insertNode;
  556.         insertNode = findNode(insertVal, rootNode);
  557.         if (insertVal > subtree.rootNode.value)
  558.             insertNode.leftChild = subtree.rootNode;
  559.         else
  560.             insertNode.rightChild = subtree.rootNode;
  561.     }
  562.  
  563.     public void printTreeInFile(FileWriter fileWriter) {
  564.         Stack globalStack = new Stack();
  565.         globalStack.push(rootNode);
  566.         int gaps = (int) Math.pow(2, findMaxDepth(rootNode));
  567.         boolean isRowEmpty = false;
  568.         String separator = "-----------------------------------------------------------------";
  569.         try {
  570.             fileWriter.write(separator + "\n");
  571.             while (!isRowEmpty) {
  572.                 Stack localStack = new Stack();
  573.                 isRowEmpty = true;
  574.                 for (int j = 0; j < gaps; j++)
  575.                     fileWriter.write(' ');
  576.                 while (!globalStack.isEmpty()) {
  577.                     Node temp = (Node) globalStack.pop();
  578.                     if (temp != null) {
  579.                         fileWriter.write(Integer.toString(temp.value));
  580.                         localStack.push(temp.leftChild);
  581.                         localStack.push(temp.rightChild);
  582.                         if (temp.leftChild != null || temp.rightChild != null)
  583.                             isRowEmpty = false;
  584.                     } else {
  585.                         fileWriter.write("__");
  586.                         localStack.push(null);
  587.                         localStack.push(null);
  588.                     }
  589.                     for (int j = 0; j < gaps * 2 - 2; j++)
  590.                         fileWriter.write(' ');
  591.                 }
  592.                 fileWriter.write("\n");
  593.                 gaps /= 2;
  594.                 while (!localStack.isEmpty())
  595.                     globalStack.push(localStack.pop());
  596.             }
  597.             fileWriter.write(separator + "\n");
  598.         }  catch (IOException e) {
  599.             System.out.println("\nОшибка! Некорректный файл вывода.");
  600.         }
  601.     }
  602. }
  603.  
  604. package com.example.lab5_2;
  605.  
  606. public class Node {
  607.     public int value;
  608.     public Node leftChild;
  609.     public Node rightChild;
  610.    
  611. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement