Бинарное дерево поиска. Разработать функцию удаления - C (СИ)
Формулировка задачи:
Здравствуйте! Помогите пожалуйста!
Имеетсясвязной список
, который содержитцелые числа
. Нужно сформировать на основе спискабинарное дерево поиска
, а также нужно разработатьфункцию удаления
из дерева всех узлов, содержащих отрицательные значения.Очень нужна ваша помощь!!!
Забыл код:
#include "stdafx.h" #include <iostream> using namespace std; struct node { int key; node* lft; node* rgt; node(int key) : key(key), lft(0), rgt(0) { } ~node() { delete lft; delete rgt; } bool isleaf() const { return (lft == rgt) && (lft == NULL); } }; node* destroy(node *n) { // дерево состоит из одной вершины if (n->isleaf()) { delete n; return 0; } else // левое поддерево пусто if (n->lft == 0) { // сохраняем указатель на правое поддерево node* r = n->rgt; // копируем состояние узла находящегося справа *n = *r; // удаляем узел r->lft = 0; r->rgt = 0; delete r; } else // левое поддерево не пусто { // ищем узел являющийся самым правым в левом поддереве // самый правый узел node *c = n->lft; // родитель самого правого узла node *p = n->lft; // двигаемся по правой ветви левого поддерева while (c->rgt) { p = c; c = c->rgt; } // левое поддерево самого правого узла становиться правым поддеревом родителя p->rgt = c->lft; // рвем отношение c->lft = NULL; // переносим ключ n->key = c->key; // удаляем самый правый узел delete c; } return n; } node* remove(node *n, int key) { // если достигли листа, то узла с данным ключем не существует if (n == NULL) return 0; // если ключ текущего узла меньше искомого if (n->key < key) { // идем по правой ветке n->rgt = remove(n->rgt, key); return n; } else // если ключ текущего узла больше искомого if (key < n->key) { // идем по левой ветке n->lft = remove(n->lft, key); return n; } // ключ текущего узла равен искомому return destroy(n); } void print(node *n, int l = 0) { if (n) { print(n->rgt, l + 2); std::cout << std::string(l, ' ') << n->key << '\n'; //printf(" %s \n", n->key,); print(n->lft, l + 2); } } int main() { // исходное дерево node *tree = new node(10); tree->lft = new node(5); tree->lft->rgt = new node(8); tree->lft->rgt->lft = new node(6); tree->rgt = new node(15); // исходное дерево print(tree); // последовательно удаляем каждый элемент дерева remove(tree, 10); print(tree); tree = remove(tree, 6); print(tree); tree = remove(tree, 5); print(tree); tree = remove(tree, 8); print(tree); tree = remove(tree, 15); print(tree); delete tree; return 0; }
Решение задачи: «Бинарное дерево поиска. Разработать функцию удаления»
textual
Листинг программы
#include "stdafx.h" #include <iostream> #include <stdio.h> #include <stdlib.h> #include "locale.h" struct node { int key; struct node *left, *right; }; /* Функция для создания нового узла дерева */ struct node *newNode(int item) { struct node *temp = (struct node *)malloc(sizeof(struct node)); temp->key = item; temp->left = temp->right = NULL; return temp; } /* Функция для образования симметричного обхода дерева */ void inorder(struct node *root) { if (root != NULL) { inorder(root->left); printf("%d ", root->key); inorder(root->right); } } /* Функция для вставки нового узла с данным ключом в дерево */ struct node* insert(struct node* node, int key) { if (node == NULL) return newNode(key); if (key < node->key) node->left = insert(node->left, key); else node->right = insert(node->right, key); return node; } /* Given a non-empty binary search tree, return the node with minimum key value found in that tree. Note that the entire tree does not need to be searched. */ struct node * minValueNode(struct node* node) { struct node* current = node; while (current->left != NULL) current = current->left; return current; } /* Функция удаления ключа и возврата нового корня */ struct node* deleteNode(struct node* root, int key) { if (root == NULL) return root; if (key < root->key) root->left = deleteNode(root->left, key); else if (key > root->key) root->right = deleteNode(root->right, key); else { if (root->left == NULL) { struct node *temp = root->right; free(root); return temp; } else if (root->right == NULL) { struct node *temp = root->left; free(root); return temp; } struct node* temp = minValueNode(root->right); root->key = temp->key; root->right = deleteNode(root->right, temp->key); } return root; } int main() { /* Дерево: 50 / \ 30 70 / \ / \ 20 40 60 80 */ struct node *root = NULL; root = insert(root, 50); root = insert(root, 30); root = insert(root, 20); root = insert(root, 40); root = insert(root, 70); root = insert(root, 60); root = insert(root, 80); setlocale(0, "RUS"); if (root < 0) { root = deleteNode(root, 20); } printf("Дерево списком: \n"); inorder(root); /////////////////////////////////////// if (root < 0) { root = deleteNode(root, -20); } ////////////////////////////////////// /*printf("\nУдаляем 20\n"); root = deleteNode(root, 20); printf("Дерево без 20 \n"); inorder(root); printf("\nУдаляем 30\n"); root = deleteNode(root, 30); printf("Дерево без 30 \n"); inorder(root); printf("\nУдаляем 50\n"); root = deleteNode(root, 50); printf("Дерево без 50 \n"); inorder(root);*/ return 0; }
Объяснение кода листинга программы
- Создание нового узла дерева с помощью функции newNode(int item).
- Вставка нового узла в дерево с помощью функции insert(struct node* node, int key).
- Поиск узла с минимальным значением ключа в дереве с помощью функции minValueNode(struct node* node).
- Удаление ключа и возврат нового корня с помощью функции deleteNode(struct node* root, int key).
- Создание дерева для тестирования функций:
- Создание корневого узла с ключом 50.
- Вставка узлов с ключами 30, 20, 40, 70, 60 и 80 в дерево.
- Установка русской локали для вывода.
- Вывод списка узлов дерева с помощью функции inorder(struct node* root).
- Удаление узла с ключом 20 из дерева.
- Удаление узла с ключом 30 из дерева.
- Удаление узла с ключом 50 из дерева.
- Возвращение локали на английский язык.
- Ввод отрицательного значения для ключа, чтобы проверить обработку ошибок в функции deleteNode(struct node* root, int key).
- Ввод отрицательного значения для ключа, чтобы проверить обработку ошибок в функции deleteNode(struct node* root, int key).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д