Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 4
Регистрация: 18.11.2013
Сообщений: 42

Удаление узлов из бинарного дерева до даты, введенной с клавиатуры

30.04.2015, 19:00. Показов 908. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, такой вопрос.
Используя классы, создать упорядоченное бинарное дерево, которое описывает справочник файлов в файловой системе. Каждому узлу соответствует некоторый файл , в узле содержится имя файла и дата последнего обращения к нему. Узлов в дереве не менее 15. Реализовать функцию, которая удаляет из дерева все файлы(узлы), обращение к которому было произведено до даты, введённой с клавиатуры. Исходное и результирующее дерево вывести на экран.

Сам класс кое-как сделал, но не знаю, что делать с функциями поиска нужного узла и удаления всех узлов до этого узла. Помогите, пожалуйста.

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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include <iostream>
 
using namespace std;
 
class Node
{
    char key;
    int d, m, y;
    Node* left;
    Node* right;
    Node* parent;
public:
    Node() {key=-1, d=-1, m=-1, y=-1; left=NULL, right=NULL, parent=NULL;};
    void setKey(char aKey) {key=aKey;};
    void setD(int aD){d=aD;};
    void setM(int aM){m=aM;};
    void setY(int aY){y=aY;};
    void setLeft(Node* aLeft) {left=aLeft;};
    void setRight(Node* aRight) {right=aRight;};
    void setParent(Node* aParent) {parent=aParent;};
    char Key() {return key;};
    int D() {return d;};
    int M() {return m;};
    int Y() {return y;};
    Node* Left() {return left;};
    Node* Right() {return right;};
    Node* Parent() {return parent;};
};
 
class Tree
{
    Node* root;
public:
    Tree();
    ~Tree();
    Node* Root(){return root;};
    void AddNode(char key, int d, int m, int y);
    Node* FindNode(int d, int m, int y, Node* parent);
    void walk(Node* node);
    void DeleteNode(char key, int d, int m, int y);
private:
    void AddNode(char key, int d, int m, int y, Node* leaf);
    void FreeNode(Node* leaf);
};
 
Tree::Tree()
{
    root=NULL;
}
 
Tree::~Tree()
{
    FreeNode(root);
}
 
void Tree::FreeNode(Node* leaf)
{
    if(leaf!=NULL)
    {
        FreeNode(leaf->Left());
        FreeNode(leaf->Right());
        delete leaf;
    }
}
 
void Tree::AddNode(char key, int d, int m, int y)
{
    if(root==NULL)
    {
        cout << "Файл " << key << " добавлен в корень." << endl;
        Node* n=new Node();
        n->setKey(key);
        n->setD(d);
        n->setM(m);
        n->setY(y);
        root=n;
    }
    else
    {
        cout << "Файл " << key << " добавлен." << endl;
        AddNode(key, d, m, y, root);
    }
}
 
void Tree::AddNode(char key, int d, int m, int y, Node* leaf)
{
    if(key<=leaf->Key())
    {
        if(leaf->Left()!=NULL)
            AddNode(key, d, m, y, leaf->Left());
        else
        {
            Node* n=new Node();
            n->setKey(key);
            n->setD(d);
            n->setM(m);
            n->setY(y);
            n->setParent(leaf);
            leaf->setLeft(n);
        }
    }
    else
    {
        if(leaf->Right()!=NULL)
            AddNode(key, d, m, y, leaf->Right());
        else
        {
            Node* n=new Node();
            n->setKey(key);
            n->setD(d);
            n->setM(m);
            n->setY(y);
            n->setParent(leaf);
            leaf->setRight(n);
        }
    }
}
 
Node* Tree::FindNode(int d, int m, int y, Node* node)
{
    if(node==NULL)
        return NULL;
    else if(node->D()==d, node->M()==m, node->Y()==y)
        return node;
    else if(y<=node->Y())
        FindNode(d, m, y, node->Left());
    else if(y>node->Y())
        FindNode(d, m, y, node->Right());
    else
        return NULL;
}
 
void Tree::walk(Node* node)
{
    if(node)
    {
        cout << "Файл: " << node->Key()<< " Дата:" << node->D() << "." << node->M() << "." << node->Y() << endl;
        walk(node->Left());
        walk(node->Right());
    }
}
 
void Tree::DeleteNode(char key, int d, int m, int y)
{
    Node* thisKey = FindNode(d, m, y, root);
 
    if ( thisKey->Left() == NULL && thisKey->Right() == NULL )
    {
        if ( thisKey->Key() > thisKey->Parent()->Key() )
            thisKey->Parent()->setRight(NULL);
        else
            thisKey->Parent()->setLeft(NULL);
 
        delete thisKey;
    }
}

Добавлено через 20 часов 18 минут
Слегка поменял код, но теперь даже узлы не добавляются. Что я сделал не так?
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
101
102
103
104
105
106
107
108
#include <iostream>
 
using namespace std;
 
class Tree;
 
class Node
{
    char name;
    int d, m, y;
    Node* left;
    Node* right;
    Node* parent;
public:
    friend Tree;
};
 
class Tree
{
    Node* root;
    void walk(Node* node);
    void AddNode(char name, int d, int m, int y, Node* parent);
public:
    Tree();
    void AddNode(char name, int d, int m, int y);
    void walk();
 
};
 
Tree::Tree()
{
    root=NULL;
}
void Tree::AddNode(char name, int d, int m, int y)
{
    if(root==NULL)
    {
        cout << "Файл " << name << " добавлен в корень." << endl;
        Node* n=new Node;
        n->name=name;
        n->d=d;
        n->m=m;
        n->y=y;
        root=n;
    }
 
    else
    {
        cout << "Файл " << name << " добавлен." << endl;
        AddNode( name, d, m, y, root)
    }
}
 
void Tree::AddNode(char name, int d, int m, int y, Node* leaf)
{
        if(y<=leaf->y)
        {
            if(leaf->left!=NULL)
                AddNode(name, d, m, y, leaf->left);
 
            else
            {
                Node* n=new Node;
                n->name=name;
                n->d=d;
                n->m=m;
                n->y=y;
                n->parent=leaf;
                leaf->left=n;
            }
        }
 
        else
        {
 
            if(leaf->right!=NULL)
                AddNode(name, d, m, y, leaf->right);
 
            else
            {
                Node* n=new Node();
                n->name;
                n->d=d;
                n->m=m;
                n->y=y;
                n->parent=leaf;
                leaf->right=n;
            }
        }
}
 
 
 
 
void Tree::walk()
{
    walk(root);
}
 
void Tree::walk(Node* node)
{
    if(node)
    {
        cout << "Файл: " << node->name<< " Дата:" << node->d << "." << node->m << "." << node->y << endl;
        walk(node->left);
        walk(node->right);
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.04.2015, 19:00
Ответы с готовыми решениями:

В рабочей программе добавить для дерева бинарного поиска нахождение отрицательных значений узлов дерева
Полностью готовая программа, но что дописать в мейне чтобы он выводил произведение отрицательных узлов???:-| using System; using...

Подсчет узлов бинарного дерева
вот код программы: (defun node_counter(tree) (cond ((null tree) 0) (t (+1...

Монотонная последовательность узлов бинарного дерева поиска
Добрый день. есть бинарное дерево поиска и какое-то заданное число S. Нужно найти все монотонные последовательности узлов дерева, сумма...

2
0 / 0 / 4
Регистрация: 18.11.2013
Сообщений: 42
05.05.2015, 12:04  [ТС]
Переделал немного
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
include <iostream>
 
using namespace std;
 
class Tree
{
    struct Node
    {
        Node* left;
        Node* right;
        char name;
        int day;
        int month;
        int year;
    };
    Node* root;
    void print1(Node*);
 public:
     Tree()
     {
         root=0;
     }
     bool isEmptry() const { return root==0; }
     void add_node(char name, int d, int m, int y);
     void print();
     void del_node(char name, int d, int m, int y);
 
 
 
 
};
 
void Tree::add_node(char name, int day, int month, int year)
{
    Node* t=new Node;
    Node* parent;
    t->name=name;
    t->day=day;
    t->month=month;
    t->year=year;
    t->left=0;
    t->right=0;
    parent=0;
 
    if (isEmptry()) root=t;
    else
    {
        Node* curr;
        curr=root;
 
        while(curr)
        {
            parent=curr;
            if(t->name > curr->name) curr=curr->right;
            else curr=curr->left;
        }
 
        if(t->name < parent->name)
            parent->left=t;
        else
            parent->right=t;
    }
}
 
void Tree::print()
{
    print1(root);
}
 
void Tree::print1(Node* p)
{
    if(p != 0)
    {
        cout<<" "<<p->name<<" "<< p->day << "." << p->month << "." << p->year << endl;
        if(p->left) print1(p->left);
        if(p->right) print1(p->right);
    }
    else return;
}
 
int main()
{
    Tree c;
    setlocale(0, "");
    char name;
    int i,n, d, m, y;
    Tree* tree = new Tree();
 
    cout << "Введите кол-во файлов" << endl;
    cin >> n;
    for(i=0; i<n; i++)
        {
        cout << "Имя файла: " << endl;
        cin >> name;
        cout << "День: " << endl;
        cin >> d;
        cout << "Месяц: " << endl;
        cin >> m;
        cout << "Год: " << endl;
        cin >> y;
        с.add_node(name, d, m, y);
        }
 
 
    c.print();
    cout << endl;
 
 
 
    c.print();
    cout << endl;
 
    return 0;
}
Но с удалением узлов ничего не могу придумать.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Tree::deleteNode(Node* p)
{
    if(p != 0)
    {
        
        if(p->left) deleteNode(p->left);
        if(p->right) deleteNode(p->right);
    }
    if(p->year <= year)
    {
        if(p->day <= day || p->month<=month)
        {
            //Здесь удаляется узел
            deleteNode(Node* p);
        }
                else deleteNode(Node* p);
    }
    else 
        deleteNode(Node* p);
}
Возможно так или как-то иначе?
0
0 / 0 / 4
Регистрация: 18.11.2013
Сообщений: 42
06.05.2015, 15:19  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Tree::deleteNodes(int day, int month, int year)
{
    Node* curr;
    Node* parent;
    curr = root;
    parent = (Node*)NULL;
 
    if(curr->left!=0 ||curr->right!=0)
    {
        if(parent->year<year)
        {
            if(parent->day<day || parent->month<month)
            {
 
            }
        }
    }
}
Дальше ничего не могу придумать. Помогите, пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.05.2015, 15:19
Помогаю со студенческими работами здесь

Создание бинарного дерева и ограничение на количество узлов в ней
В задании по созданию бинарного дерева есть условие на то, что узлов в дереве должно быть не больше 10. Пробую поставить такое ограничение...

Определить количество узлов на каждом уровне данного бинарного дерева
Помогите с этой задачей) Определить количество узлов на каждом уровне данного бинарного дерева. Плиз помогите!!!!! если мона с...

Найти среднее арифметическое узлов бинарного дерева целых чисел
Помогите решить. Надо срочно!!! Создать бинарное дерево целых чисел. Вывести на экран значение узлов и их среднее арифметическое

Написать метод который считает среднее арифметическое узлов бинарного дерева
подскажите пожалуйста как написать метод который считает среднее арифметическое узлов бинарного дерева?

Найти сумму значений узлов бинарного дерева, находящихся на нечетных уровнях
Помогите, пожалуйста с задачкой. :sorry: Найти сумму значений узлов бинарного дерева, находящихся на нечетных уровнях


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru