Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Nata_sw
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 2
#1

Удалить максимальный лист дерева - C++

31.05.2016, 07:08. Просмотров 293. Ответов 4
Метки нет (Все метки)

ПОМОГИТЕ!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2016, 07:08
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Удалить максимальный лист дерева (C++):

Создание BST-дерева методом вставки в лист (рекурсивная реализация) - C++
Доброго времени суток, дали задачу: Создание BST-дерева методом вставки в лист(рекурсивная реализация). Не рекурсивная функция печати...

Найти максимальный элемент дерева - C++
Здравствуйте. Помогите, пожалуйста, найти максимальный элемент в данной программе. Тут выводится несколько "узлов", т.е. дерево с помощью...

Удалить самый высокий лист в дереве - C++
Помогите, пожалуйста, написать прогу на C++. Удалить самый высокий лист в дереве. Задача на рекурсию.

Дано N-дерево. Удалить самый низкий лист(листья) - C++
Нашел в сети вот такой код, пишут что он рабочий, но у меня при компиляции выдает ошибку на 197 строчке. Объясните, что не так с этим...

Удалить узел бинарного дерева - C++
необходимо удалить узел, у которого нет потомков нужно обнулить ссылку предка и освободить память, но не совсем понимаю, как это сделать....

Как удалить корень дерева? - C++
пример... двоичное дерево состоит из корня с левым и правым узлом ... а теперь ,как удалить корень и связать два эти узла (к примеру левый...

4
gru74ik
Модератор
Эксперт CЭксперт С++
4362 / 1938 / 210
Регистрация: 20.02.2013
Сообщений: 5,144
Записей в блоге: 22
31.05.2016, 08:24 #2
Nata_sw, что именно не получается? Где собственные попытки? Код где?
0
SatanaXIII
Супер-модератор
Эксперт С++
5694 / 2749 / 258
Регистрация: 01.11.2011
Сообщений: 6,710
Завершенные тесты: 1
31.05.2016, 10:41 #3
Надо подойти к дереву, внимательно посмотреть на него, обнаружить максимальный лист, затем залезть на дерево и удалить его. Сложность здесь, на мой взгляд, в том, что, очутившись на дереве, можно потерять указатель на максимальный лист. Придется использовать память; проецировать ее на текущее положение поиска. В общем задача не тривиальна.
0
Nata_sw
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 2
31.05.2016, 13:42  [ТС] #4
помогите с кодом, очень надо!
0
Геомеханик
773 / 579 / 402
Регистрация: 26.06.2015
Сообщений: 1,378
31.05.2016, 16:25 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот набросал, почти получилась приоритетная очередь с уникальными элементами.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
#include <cstdlib>
 
struct tree {
    tree* left;
    tree* right;
    int   val;
};
 
bool tree_add(tree** tr, int val);
void tree_pop_max(tree** tr);
int  tree_max(const tree* tr);
bool tree_empty(const tree* tr);
 
 
int main(void){
    tree* tr = NULL;
    for(int i = 0; i < 30; ++i)
        tree_add(&tr, rand() % 10);
 
    while(! tree_empty(tr)){
        std::cout << tree_max(tr) << ' ';
        tree_pop_max(&tr);
    }
    return 0;
}
 
//вставка
bool tree_add(tree** tr, int val){
    tree* p = *tr;
    while(p != NULL){
        if(val < p->val){
            tr = &p->left;
            p  = p->left;
        } else if(val > p->val){
            tr = &p->right;
            p  = p->right;
        } else
            return false;
    }
 
    if((p = new (std::nothrow) tree()) == NULL)
        return false;
 
    p->left = p->right = NULL;
    p->val  = val;
    *tr = p;
    return true;
}
 
//удаление максимального элемента
void tree_pop_max(tree** tr){
    tree* i, *j;
    if(*tr == NULL)
        return;
    else if(((*tr)->left == NULL) && ((*tr)->right == NULL)){
        delete *tr;
        *tr = NULL;
        return;
    }
 
    tree* p = *tr;
    while(p->right != NULL){
        tr = &p->right;
        p  = p->right;
    }
 
    if(p->right == NULL)
        *tr = p->left;
    else {
        j = p->right;
        if(j->left == NULL){
            j->left = p->left;
            *tr = j;
        } else {
            for(i = j->left; i->left != NULL; i = j->left)
                j = i;
 
            j->left  = i->right;
            i->left  = p->left;
            i->right = p->right;
            *tr = i;
        }
    }
    delete p;
}
 
//максимальный элемент
int tree_max(const tree* tr){
    if(tr != NULL){
        while(tr->right != NULL)
            tr = tr->right;
        return tr->val;
    }
    return 0;
}
 
bool tree_empty(const tree* tr){ 
    return (tr == NULL);
}
1
31.05.2016, 16:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2016, 16:25
Привет! Вот еще темы с ответами:

Найти и удалить среднюю по значению из вершин дерева - C++
Здравствуйте, Я студент 1-ого курса, нужно помощь с написанием кода к этой программе. Задача 25 Условие Найти и удалить...

Удалить из дерева ветвь с вершиной, имеющей заданный ключ - C++
удалить из дерева ветвь с вершиной, имеющей заданный ключ.

Удалить из дерева ветвь с вершиной, имеющей заданный ключ - C++
удалить из дерева ветвь с вершиной, имеющей заданный ключ.

Удалить из бинарного дерева всех отцов, имеющих одного сына - C++
Написала класс по работе с бинарным деревом. Помогите, пожалуйста, написать функцию по удалению из дерева всех однодетных отцов. Сижу уже...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru