刪除我的孩子有這樣的結構:C++:二叉樹 - 從親代載體
#include <stddef.h>
#include <vector>
typedef int T;
class tree;
class node {
T info;
std::vector<node*> children;
friend class tree;
public:
typedef std::vector<node*>::iterator iterator;
iterator begin() {
return children.begin();
}
iterator end() {
return children.end();
}
T get() {
return info;
}
};
class tree {
node* r;
void del(node* v) {
if (v == NULL) return;
for (node::iterator it = v->begin(); it != v->end(); ++it)
del(*it);
delete v;
}
public:
tree() : r(NULL) { }
node* add(T info, node* parent) {
node* v = new node;
v->info = info;
if (parent != NULL) parent->children.push_back(v);
else {
if (r != NULL) del(r);
r = v;
}
return v;
}
node* add(T info) {
return add(info, NULL);
}
node* root() { return r; }
void remove(node* v) {
if (r == v) r = NULL;
else { /* remove v from the list of children of its parent */ }
del(v);
}
};
我需要完成的功能從其父母的列表中刪除節點v卸下。爲了有效地這樣做,我會向節點類添加一個指向其父節點的指針,並相應地更新添加函數。 這是我的解決方案 我修改與增加功能:
node* add(T info, node* parent) {
node* v = new node;
v->info = info;
if (parent != NULL) {
parent->children.push_back(v);
v->parent=parent; }
else {
if (r != NULL) del(r);
r = v;
r->parent=null;
}
return v;
}
,我修改刪除功能:
void remove(node* v) {
if (r == v) r = NULL;
else {
v->parent->children.pop_back(v);
}
del(v);
}
這是概念上是否正確?不幸的是,類vector
的pop_back method
不允許這種類型的參數,所以這會返回一個錯誤。 這是正確的還是應該使用其他實現?
對不起,我不是很熟悉C++。由於
謝謝,您的建議是正確的。這是一個練習,所以我必須尊重結構和實施。順便說一句,我會問,我怎樣才能使樹的解構器,以一種方式來刪除樹的所有節點? – rollotommasi
@rollotommasi增加了一個析構函數給我的答案... – Aconcagua
謝謝你。老實說,我不知道用於「for」指令的風格,這就是爲什麼我有點卡住。建立一個類的destroctor並不是一個好習慣,它銷燬那些沒有在那個類中聲明的項目,我想......這就是爲什麼在〜tree()中我們只刪除r,並且在〜node()中我們刪除所有節點...! @Aconcagua – rollotommasi