struct TNode
{
int num;
TNode * left;
TNode * right;
TNode();
~TNode();
TNode(int n);
bool isLeaf();
};
TNode::TNode()
{
num = 0;
left = right = 0;
}
TNode::TNode(int n)
{
num = n;
left = right = 0;
}
TNode::~TNode()
{
if(left && left->isLeaf())
delete left;
if(right && right->isLeaf())
delete right;
}
bool TNode::isLeaf()
{
return ((left == right) && (right == 0));
}
Вопрос по деструктору
Код:
Возникла потребность в простейшем дереве. Дерево хочу хранить в динимически распределяемой памяти. Хочется, чтобы операция
Код:
TNode * t;
.....
delete t;
.....
delete t;
освобождала память,выделенную под все элементы дерева, а не только под его корень. Правильно ли я это сделал?
void Clear(TNode* t)
{
if(t<>NULL)
{
Clear(t.left);
Clear(t.right);
delete t;
}
}
Цитата:
Originally posted by solovey
освобождала память,выделенную под все элементы дерева, а не только под его корень. Правильно ли я это сделал?
освобождала память,выделенную под все элементы дерева, а не только под его корень. Правильно ли я это сделал?
Если я правильно понял, то тебе нужно убрать из деструктора проверку isLeaf():
Код:
TNode::~TNode()
{
if(left) delete left;
if(right)delete right;
}
{
if(left) delete left;
if(right)delete right;
}
Цитата:
Originally posted by Green
Если я правильно понял, то тебе нужно убрать из деструктора проверку isLeaf():
Если я правильно понял, то тебе нужно убрать из деструктора проверку isLeaf():
Код:
TNode::~TNode()
{
if(left) delete left;
if(right)delete right;
}
{
if(left) delete left;
if(right)delete right;
}
Если я правильно понял, то
if(left) delete left;
означает: если на левой ветке что-то висит, тогда отрубать его, а концов дочерных вершин этой ветки в воду.
Или ты подрозумеваешь переопределение оператора delete?
Цитата:
Originally posted by rostyslav
Если я правильно понял, то
if(left) delete left;
означает: если на левой ветке что-то висит, тогда отрубать его, а концов дочерных вершин этой ветки в воду.
Или ты подрозумеваешь переопределение оператора delete?
Если я правильно понял, то
if(left) delete left;
означает: если на левой ветке что-то висит, тогда отрубать его, а концов дочерных вершин этой ветки в воду.
Или ты подрозумеваешь переопределение оператора delete?
Ну почему же...
При уделении левого нода, он в свою очередь удалит свои ноды (в своем деструкторе), а те свои, и так до самого низа.
Цитата:
Originally posted by Green
Ну почему же...
При уделении левого нода, он в свою очередь удалит свои ноды (в своем деструкторе), а те свои, и так до самого низа.
Ну почему же...
При уделении левого нода, он в свою очередь удалит свои ноды (в своем деструкторе), а те свои, и так до самого низа.
Да ты прав. Это же не void*.
Цитата:
Originally posted by Green
Если я правильно понял, то тебе нужно убрать из деструктора проверку isLeaf():
Если я правильно понял, то тебе нужно убрать из деструктора проверку isLeaf():
Код:
TNode::~TNode()
{
if(left) delete left;
if(right)delete right;
}
{
if(left) delete left;
if(right)delete right;
}
Действительно, так логичнее :) Всем спасибо.