Удаление узлов из бинарного дерева до даты, введенной с клавиатуры
30.04.2015, 19:00. Показов 748. Ответов 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
|