Бинарное дерево поиска. Разработать функцию удаления - 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).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д