Исправить поиск минимального поддерева - C (СИ)

Узнай цену своей работы

Формулировка задачи:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct node {
struct node *left;
struct node *right;
struct node *middle;
int info;};
//функция обхода
void show (node *&tree)
{
    if(tree != NULL)
    {
        show(tree->left);
        printf("%d",tree->info);
        show(tree->middle);
        show(tree->right);
 
    }
}
//функция Создание корня дерева;
void add_node (int info,node *&Mytree)
{
    if(NULL == Mytree)
    {
        Mytree = (struct node*)malloc(sizeof(struct node));
        Mytree ->info = info;
        Mytree ->left =  NULL;
        Mytree -> right = NULL;
        Mytree -> middle = NULL;
    }
    if(info<Mytree->info)
    {
        if(Mytree->left!=NULL)add_node(info,Mytree->left);
        else
        {
            Mytree ->left = (struct node*)malloc(sizeof(struct node));
            Mytree ->left ->left = NULL;
            Mytree ->left ->right = NULL;
            Mytree ->left ->middle= NULL;
            Mytree->left  ->info=info;
        }
    }
    if(info>Mytree->info)
    {
        if(Mytree->right!=NULL)add_node(info,Mytree->right);
            else
        {
            Mytree -> right = (struct node*)malloc(sizeof(struct node));
            Mytree -> right -> left = NULL;
            Mytree -> right -> right = NULL;
            Mytree -> right -> middle = NULL;
            Mytree -> right -> info = info;
        }
    }
    if(info == Mytree->info)
    {
        if(Mytree->middle!=NULL)add_node(info,Mytree->middle);
        else
        {
            Mytree -> middle = (struct node*)malloc(sizeof(struct node));
            Mytree -> middle ->middle = NULL;
            Mytree -> middle ->right = NULL;
            Mytree -> middle ->left = NULL;
            Mytree -> middle->info = info;
        }
    }
}
//функция  добавления
/*void insert(int info,node *&Mytree)
 
{
    if (info>Mytree->info)insert(info,&Mytree->right);
    else insert (info,&Mytree->left);
}*/
int main(){
    int i,n,e;
    printf("input how many elements you want write: ");
    scanf("%d",&n);
struct node *tree = NULL;
for(i = 0;i<n;i++)
{
    printf("input number: ");
    scanf("%d",&e);
    add_node(e,tree);
}
show(tree);
getch();
return 0;
}
лишнее повторение,если совпадает с корнем

Решение задачи: «Исправить поиск минимального поддерева»

textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct node {
struct node *left;
struct node *right;
struct node *middle;
int info;};
//функция обхода
void show (node *&tree)
{
    if(tree != NULL)
    {
        show(tree->left);
        printf("%d",tree->info);
        show(tree->middle);
        show(tree->right);
 
    }
}
//функция Создание корня дерева;
void add_node (int info,node *&Mytree)
{
    if(NULL == Mytree)
    {
        Mytree = (struct node*)malloc(sizeof(struct node));
        Mytree ->info = info;
        Mytree ->left =  NULL;
        Mytree -> right = NULL;
        Mytree -> middle = NULL;
    }
    else {
    if(info<Mytree->info)
    {
        if(Mytree->left!=NULL)add_node(info,Mytree->left);
        else
        {
            Mytree ->left = (struct node*)malloc(sizeof(struct node));
            Mytree ->left ->left = NULL;
            Mytree ->left ->right = NULL;
            Mytree ->left ->middle= NULL;
            Mytree->left  ->info=info;
        }
    }
    if(info>Mytree->info)
    {
        if(Mytree->right!=NULL)add_node(info,Mytree->right);
            else
        {
            Mytree -> right = (struct node*)malloc(sizeof(struct node));
            Mytree -> right -> left = NULL;
            Mytree -> right -> right = NULL;
            Mytree -> right -> middle = NULL;
            Mytree -> right -> info = info;
        }
    }
    if(info == Mytree->info)
    {
        if(Mytree->middle!=NULL)add_node(info,Mytree->middle);
        else
        {
            Mytree -> middle = (struct node*)malloc(sizeof(struct node));
            Mytree -> middle ->middle = NULL;
            Mytree -> middle ->right = NULL;
            Mytree -> middle ->left = NULL;
            Mytree -> middle->info = info;
        }
 
}    }
}
//Поиск минимального значения в дереве
int Minimum(node *&Mytree)
{
   if(Mytree->right!=NULL){
    return Minimum(Mytree->right);
   }else{
       printf("MIN:%d",Mytree->info);
   return Mytree->info;
   }
}
int main(){
    int i,n,e;
    printf("input how many elements you want write: ");
    scanf("%d",&n);
struct node *tree = NULL;
for(i = 0;i<n;i++)
{
    printf("input number: ");
    scanf("%d",&e);
    add_node(e,tree);
}
show(tree);
Minimum(tree);
getch();
return 0;
}

Объяснение кода листинга программы

В данном коде реализованы функции для работы с двоичным деревом:

  1. Функция show - обход дерева в глубину (рекурсивная функция).
  2. Функция add_node - добавление нового узла в дерево.
  3. Функция Minimum - поиск минимального значения в дереве (рекурсивная функция).
  4. Функция main - основное меню программы, где пользователь может добавить элементы в дерево и вывести его на экран, а также найти минимальное значение в дереве. Список переменных и их значений:
  5. tree - указатель на корень дерева (начальное значение NULL).
  6. Mytree - указатель на текущий узел дерева (используется в функциях add_node и Minimum).
  7. n - количество элементов, которые пользователь хочет добавить в дерево.
  8. e - значение, которое пользователь вводит на каждом шаге цикла.
  9. i - счётчик, используемый в цикле для добавления элементов в дерево.
  10. left, right, middle - указатели на левое, правое и среднее поддерево текущего узла соответственно.
  11. info - информация (значение) текущего узла. Список действий, выполняемых в коде:
  12. Считывание количества элементов, которые пользователь хочет добавить в дерево.
  13. Инициализация указателя tree в качестве NULL.
  14. Цикл по вводу элементов пользователем.
  15. Ввод значения e с помощью функции scanf.
  16. Вызов функции add_node для добавления элемента в дерево с передачей указателя на корень дерева tree и введенного значения e.
  17. Вывод дерева на экран с помощью функции show.
  18. Вызов функции Minimum для поиска минимального значения в дереве и вывод его на экран.
  19. Ожидание нажатия клавиши с помощью функции getch.
  20. Возврат значения 0, что означает успешный конец работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.444 из 5
Похожие ответы