Исправить поиск минимального поддерева - 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; }
Объяснение кода листинга программы
В данном коде реализованы функции для работы с двоичным деревом:
- Функция
show
- обход дерева в глубину (рекурсивная функция). - Функция
add_node
- добавление нового узла в дерево. - Функция
Minimum
- поиск минимального значения в дереве (рекурсивная функция). - Функция
main
- основное меню программы, где пользователь может добавить элементы в дерево и вывести его на экран, а также найти минимальное значение в дереве. Список переменных и их значений: tree
- указатель на корень дерева (начальное значение NULL).Mytree
- указатель на текущий узел дерева (используется в функцияхadd_node
иMinimum
).n
- количество элементов, которые пользователь хочет добавить в дерево.e
- значение, которое пользователь вводит на каждом шаге цикла.i
- счётчик, используемый в цикле для добавления элементов в дерево.left
,right
,middle
- указатели на левое, правое и среднее поддерево текущего узла соответственно.info
- информация (значение) текущего узла. Список действий, выполняемых в коде:- Считывание количества элементов, которые пользователь хочет добавить в дерево.
- Инициализация указателя
tree
в качестве NULL. - Цикл по вводу элементов пользователем.
- Ввод значения
e
с помощью функцииscanf
. - Вызов функции
add_node
для добавления элемента в дерево с передачей указателя на корень дереваtree
и введенного значенияe
. - Вывод дерева на экран с помощью функции
show
. - Вызов функции
Minimum
для поиска минимального значения в дереве и вывод его на экран. - Ожидание нажатия клавиши с помощью функции
getch
. - Возврат значения 0, что означает успешный конец работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д