0 / 0 / 4
Регистрация: 18.11.2013
Сообщений: 42
1

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

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

Author24 — интернет-сервис помощи студентам
В общем, такой вопрос.
Используя классы, создать упорядоченное бинарное дерево, которое описывает справочник файлов в файловой системе. Каждому узлу соответствует некоторый файл , в узле содержится имя файла и дата последнего обращения к нему. Узлов в дереве не менее 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2015, 19:00
Ответы с готовыми решениями:

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

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

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

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

2
0 / 0 / 4
Регистрация: 18.11.2013
Сообщений: 42
05.05.2015, 12:04  [ТС] 2
Переделал немного
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  [ТС] 3
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
06.05.2015, 15:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2015, 15:19
Помогаю со студенческими работами здесь

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

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

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

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

преобразование списка смежных вершин (мультисписок) в связный список узлов бинарного дерева
товарищи, помогите сообразить алгоритм, после праздников туго идет.. спасибо

Бинарные деревья. Вывод потомков для каждого из узлов бинарного дерева поиска
Здравствуйте, уважаемые форумчане! Продолжая изучать бинарные деревья, решил подумать о выгодности...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru