Advertisement
ksyshshot

Lab_5_2

Mar 31st, 2023 (edited)
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.64 KB | Source Code | 0 0
  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.util.Scanner;
  4.  
  5. class Node {
  6.     int data; // ключ узла
  7.     Node leftChild; // Левый узел потомок
  8.     Node rightChild; // Правый узел потомок
  9.  
  10.     public Node(int data, Node leftChild, Node rightChild) {
  11.         this.data = data;
  12.         this.leftChild = leftChild;
  13.         this.rightChild = rightChild;
  14.     }
  15. }
  16. class Tree {
  17.     public Node rootNode;
  18.  
  19.     public Tree(Node rootNode) {
  20.         this.rootNode = rootNode;
  21.     }
  22.  
  23.     public void insertNode(int value) {
  24.         Node newNode = new Node(value, null, null);
  25.         if (rootNode == null) {
  26.             rootNode = newNode;
  27.         }
  28.         else {
  29.             Node currentNode = rootNode;
  30.             Node parentNode;
  31.             while (true)
  32.             {
  33.                 parentNode = currentNode;
  34.                 if (value <= currentNode.data) {
  35.                     currentNode = currentNode.leftChild;
  36.                     if (currentNode == null){
  37.                         parentNode.leftChild = newNode;
  38.                         return;
  39.                     }
  40.                 }
  41.                 else {
  42.                     currentNode = currentNode.rightChild;
  43.                     if (currentNode == null) {
  44.                         parentNode.rightChild = newNode;
  45.                         return;
  46.                     }
  47.                 }
  48.             }
  49.         }
  50.     }
  51.  
  52.     public Node findMaxNodeInBranch(Node curr) {
  53.         if (curr.rightChild != null) {
  54.             return findMaxNodeInBranch(curr.rightChild);
  55.         } else {
  56.             return curr;
  57.         }
  58.     }
  59.  
  60.     /*public void deleteNode(Node curr, int value) {
  61.         if (curr != null) {
  62.             if (value < curr.data) {
  63.                 deleteNode(curr.leftChild, value);
  64.             }
  65.             if (value > curr.data) {
  66.                 deleteNode(curr.rightChild, value);
  67.             }
  68.             if (value == curr.data) {
  69.                 if ((curr.rightChild == null) && (curr.leftChild == null)){
  70.                     curr = null;
  71.                 } else {
  72.                     if ((curr.rightChild == null) && (curr.leftChild != null)) {
  73.                         curr = curr.leftChild;
  74.                     }
  75.                     if ((curr.rightChild != null) && (curr.leftChild == null)) {
  76.                         curr = curr.rightChild;
  77.                     }
  78.                     if ((curr.rightChild != null) && (curr.leftChild != null)) {
  79.                         Node max = findMaxNodeInBranch(curr.leftChild);
  80.                         curr.data = max.data;
  81.                         deleteNode(curr.leftChild, max.data);
  82.                     }
  83.                 }
  84.             }
  85.         }
  86.     }*/
  87.  
  88.     public boolean deleteNode(int value)
  89.     {
  90.         Node currentNode = rootNode;
  91.         Node parentNode = rootNode;
  92.         boolean isLeftChild = true;
  93.         while (currentNode.data != value) {
  94.             parentNode = currentNode;
  95.             if (value < currentNode.data) {
  96.                 isLeftChild = true;
  97.                 currentNode = currentNode.leftChild;
  98.             }
  99.             else {
  100.                 isLeftChild = false;
  101.                 currentNode = currentNode.rightChild;
  102.             }
  103.             if (currentNode == null)
  104.                 return false;
  105.         }
  106.  
  107.         if (currentNode.leftChild == null && currentNode.rightChild == null) {
  108.             if (currentNode == rootNode)
  109.                 rootNode = null;
  110.             else if (isLeftChild)
  111.                 parentNode.leftChild = null;
  112.             else
  113.                 parentNode.rightChild = null;
  114.         }
  115.         else if (currentNode.rightChild == null) {
  116.             if (currentNode == rootNode)
  117.                 rootNode = currentNode.leftChild;
  118.             else if (isLeftChild)
  119.                 parentNode.leftChild = currentNode.leftChild;
  120.             else
  121.                 parentNode.rightChild= currentNode.leftChild;
  122.         }
  123.         else if (currentNode.leftChild == null) {
  124.             if (currentNode == rootNode)
  125.                 rootNode = currentNode.rightChild;
  126.             else if (isLeftChild)
  127.                 parentNode.leftChild = currentNode.rightChild ;
  128.             else
  129.                 parentNode.rightChild = currentNode.rightChild;
  130.         }
  131.         else {
  132.             Node heir = receiveHeir(currentNode);
  133.             if (currentNode == rootNode)
  134.                 rootNode = heir;
  135.             else if (isLeftChild)
  136.                 parentNode.leftChild = heir;
  137.             else
  138.                 parentNode.rightChild = heir;
  139.         }
  140.         return true;
  141.     }
  142.     private Node receiveHeir(Node node) {
  143.         Node parentNode = node;
  144.         Node heirNode = node;
  145.         Node currentNode = node.rightChild;
  146.         while (currentNode != null)
  147.         {
  148.             parentNode = heirNode;
  149.             heirNode = currentNode;
  150.             currentNode = currentNode.leftChild;
  151.         }
  152.  
  153.         if (heirNode != node.rightChild)
  154.         {
  155.             parentNode.leftChild = heirNode.rightChild;
  156.             heirNode.rightChild = node.rightChild;
  157.         }
  158.         return heirNode;
  159.     }
  160.  
  161.     public int CountNodesInTree(Node curr) {
  162.         int count = 0;
  163.         if (curr != null) {
  164.             if ((curr.leftChild != null) || (curr.rightChild != null)) {
  165.                 count++;
  166.             }
  167.             count += CountNodesInTree(curr.leftChild);
  168.             count += CountNodesInTree(curr.rightChild);
  169.         }
  170.         return count;
  171.     }
  172.  
  173.     public int CountLeavesInTree(Node curr) {
  174.         int count = 0;
  175.         if (curr != null) {
  176.             if ((curr.leftChild == null) && (curr.rightChild == null)) {
  177.                 count++;
  178.             }
  179.             count += CountLeavesInTree(curr.leftChild);
  180.             count += CountLeavesInTree(curr.rightChild);
  181.         }
  182.         return count;
  183.     }
  184. }
  185.  
  186. public class Main {
  187.  
  188.     static final int MAX_OPERATION_COUNT = 3;
  189.     static final int MIN_OPERATION_COUNT = 0;
  190.     static final int MIN_DATA = -99;
  191.     static final int MAX_DATA = 99;
  192.     static Scanner scan = new Scanner(System.in);
  193.  
  194.  
  195.     public static void main(String[] args) {
  196.         writeTask();
  197.         Node head = new Node(0, null, null);
  198.         Tree tree = new Tree(head);
  199.         tree.rootNode = null;
  200.         System.out.println("Получить дерево из файла? 1 - да, 2 - нет");
  201.         int choice = chooseInputOutputMethod();
  202.         if (choice == 1) {
  203.             tree = addTreeFromFile(tree);
  204.         }
  205.         boolean isContinue = true;
  206.         do {
  207.             choice = chooseOperation();
  208.             switch (choice) {
  209.                 case 1:
  210.                     tree = addNewElement(tree);
  211.                     break;
  212.                 case 2:
  213.                     tree = deleteElement(tree);
  214.                     break;
  215.                 case 3:
  216.                     countNodesAndLeaves(tree);
  217.                     break;
  218.                 case 0:
  219.                     isContinue = false;
  220.                     break;
  221.             }
  222.         } while (isContinue);
  223.         scan.close();
  224.     }
  225.  
  226.     public static void writeTask() {
  227.         System.out.println("Данная программа реализует работу с бинарным деревом поиска.");
  228.         System.out.println("Список возможных функций: 1. Добавление нового элемента.");
  229.         System.out.println("                          2. Удаление элемента.");
  230.         System.out.println("                          3. Подсчёт количества узлов и листьев дерева.");
  231.         System.out.println("                          0. Завершение работы.");
  232.     }
  233.  
  234.     public static int chooseOperation() {
  235.         int choice = 0;
  236.         boolean isNotCorrect;
  237.         do {
  238.             System.out.println("Введите номер операции, которую необходимо выполнить.");
  239.             isNotCorrect = false;
  240.             try {
  241.                 choice = Integer.parseInt(scan.nextLine());
  242.             } catch (NumberFormatException e) {
  243.                 isNotCorrect = true;
  244.                 System.out.println("Некорректно введён номер операции. Повторите попытку.");
  245.             }
  246.             if ((!isNotCorrect) && (choice > MAX_OPERATION_COUNT || choice < MIN_OPERATION_COUNT)) {
  247.                 isNotCorrect = true;
  248.                 System.out.println("Введён неправильный номер операции. Он должен быть от " + MIN_OPERATION_COUNT + " до " + MAX_OPERATION_COUNT + ". Повторите попытку.");
  249.             }
  250.         } while (isNotCorrect);
  251.         return choice;
  252.     }
  253.  
  254.     public static Tree addNewElement(Tree tree) {
  255.         boolean isNotCorrect;
  256.         int data = 0;
  257.         do {
  258.             isNotCorrect = false;
  259.             System.out.println("Введите элемент, добавляемый в дерево (от -99 до 99)");
  260.             try {
  261.                 data = Integer.parseInt(scan.nextLine());
  262.             } catch (NumberFormatException e) {
  263.                 isNotCorrect = true;
  264.                 System.out.println("Некорректно введено число");
  265.             }
  266.             if ((!isNotCorrect) && (data < MIN_DATA || data > MAX_DATA)) {
  267.                 isNotCorrect = true;
  268.                 System.out.println("Значение элемента должно быть от " + MIN_DATA + " до " + MAX_DATA);
  269.             }
  270.         } while (isNotCorrect);
  271.         tree.insertNode(data);
  272.         return tree;
  273.     }
  274.  
  275.     public static Tree deleteElement(Tree tree) {
  276.         if (tree.rootNode == null) {
  277.             boolean isNotCorrect;
  278.             int data = 0;
  279.             do {
  280.                 isNotCorrect = false;
  281.                 System.out.println("Введите элемент, удаляемый из дерева (от -99 до 99)");
  282.                 try {
  283.                     data = Integer.parseInt(scan.nextLine());
  284.                 } catch (NumberFormatException e) {
  285.                     isNotCorrect = true;
  286.                     System.out.println("Некорректно введено число");
  287.                 }
  288.                 if ((!isNotCorrect) && (data < MIN_DATA || data > MAX_DATA)) {
  289.                     isNotCorrect = true;
  290.                     System.out.println("Номер формата должен быть от " + MIN_DATA + " до " + MAX_DATA);
  291.                 }
  292.             } while (isNotCorrect);
  293.             if (!(tree.deleteNode(data))) {
  294.                 System.out.println("Удаляемый элемент не найден в дереве!");
  295.             }
  296.         } else {
  297.             System.out.println("Дерево пустое, удаление элемента невозможно.");
  298.         }
  299.         return tree;
  300.     }
  301.  
  302.     public static void countNodesAndLeaves(Tree tree) {
  303.         if (tree.rootNode != null) {
  304.             int nodes = tree.CountNodesInTree(tree.rootNode);
  305.             int leaves = tree.CountLeavesInTree(tree.rootNode);
  306.             System.out.println("Количество узлов: " + nodes);
  307.             System.out.println("Количество листьев: " + leaves);
  308.         } else {
  309.             System.out.println("Бинарное дерево пустое!");
  310.         }
  311.     }
  312.  
  313.     public static int chooseInputOutputMethod() {
  314.         boolean isNotCorrect;
  315.         int choice = 0;
  316.         do {
  317.             isNotCorrect = false;
  318.             try {
  319.                 choice = Integer.parseInt(scan.nextLine());
  320.             } catch (NumberFormatException e) {
  321.                 System.out.println("Число введено некорректно. Повторите попытку...");
  322.                 isNotCorrect = true;
  323.             }
  324.             if ((!isNotCorrect) && (choice != 1) && (choice != 2)) {
  325.                 System.out.print("Введите либо 1, либо 2. Ваш выбор: ");
  326.                 isNotCorrect = true;
  327.             }
  328.         } while (isNotCorrect);
  329.         return choice;
  330.     }
  331.  
  332.     public static String takePathToFile() {
  333.         String path;
  334.         boolean isNotCorrect;
  335.         do {
  336.             isNotCorrect = false;
  337.             System.out.println("Введите путь к файлу: ");
  338.             path = scan.nextLine();
  339.             File file = new File(path);
  340.             if (!file.exists()) {
  341.                 System.out.println("Не удалось найти файл по заданному пути. Повторите попытку...");
  342.                 isNotCorrect = true;
  343.             }
  344.         } while (isNotCorrect);
  345.         return path;
  346.     }
  347.  
  348.     public static Tree addTreeFromFile(Tree oldTree) {
  349.         String path;
  350.         boolean isNotCorrect;
  351.         boolean isEmpty = true;
  352.         int element;
  353.         Node start = null;
  354.         Tree tree = new Tree(start);
  355.         do {
  356.             tree = oldTree;
  357.             path = takePathToFile();
  358.             isNotCorrect = false;
  359.             try (Scanner fileReader = new Scanner(new File(path))) {
  360.                 try {
  361.                     while (fileReader.hasNextLine()) {
  362.                         element = Integer.parseInt(fileReader.nextLine());
  363.                         if ((!isNotCorrect) && (element < MIN_DATA || element > MAX_DATA)) {
  364.                             isNotCorrect = true;
  365.                             System.out.println("Значение элемента должно быть от " + MIN_DATA + " до " + MAX_DATA);
  366.                         }
  367.                         if (!isNotCorrect) {
  368.                             tree.insertNode(element);
  369.                             isEmpty = false;
  370.                         }
  371.                     }
  372.                 } catch (NumberFormatException e) {
  373.                     isNotCorrect = true;
  374.                     System.out.println("Некорректно введено одно из значений в файле. Попробуйте заново.");
  375.                 }
  376.             } catch (IOException e) {
  377.                 isNotCorrect = true;
  378.                 System.out.println("Не выходит получить данные из файла. Попробуйте ещё раз.");
  379.             }
  380.             if ((!isNotCorrect) && (isEmpty)) {
  381.                 isNotCorrect = true;
  382.                 System.out.println("Введён пустой файл. Попробуйте ещё раз.");
  383.             }
  384.         } while (isNotCorrect);
  385.         System.out.println("Дерево получено");
  386.         return tree;
  387.     }
  388. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement