我所做的如下所示,但是在这个问题上,我在破坏树时遇到了很多问题,并且在尝试打印树时(基本上我需要在树上使用递归)。
这是因为在尝试在右子树的左侧递归调用print
时,我的方法会中断,因为我的左右子树实际上只有Node
s而不是Tree
s 。所以,我需要将我的Nodes命名为树,或者我需要创建新树,这两种树都是难看的解决方案。
我认为这里的问题是课堂设计。你能评论一下吗?谢谢!
class Node {
int _data;
public:
Node* left; // left child
Node* right; // right child
Node* p; // parent
Node(int data) {
_data = data;
left = NULL;
right = NULL;
p = NULL;
}
~Node() {
}
int d() {
return _data;
}
void print() {
std::cout << _data << std::endl;
}
};
class Tree {
Node* root;
public:
Tree() {
root = NULL;
}
Tree(Node* node) {
root = node;
}
~Tree() {
delete root->left; // this is NOT RIGHT as
// it only deletes the node
// and not the whole left subtree
delete root->right;
delete root;
}
void print(int);
void add(int);
};
答案 0 :(得分:8)
为什么不让Node
成为您的树类?根据定义,非空节点是某个树的根。这将大大简化您的代码,因为您不需要为Tree
和Node
制作不同的案例。
答案 1 :(得分:4)
更改Node的析构函数,以便删除其左右子项。然后为你的Tree析构函数删除root,所以:
~Tree() {
delete root;
}
~Node() {
delete left;
delete right;
}
答案 2 :(得分:0)
public:
~Tree() {
clear();
delete root;
}
void clear()
{
recursive_delete(root);
}
private:
void recursive_delete(Node* node)
{
if (node!=NULL)
{
recursive_delete(node->left);
recursive_delete(node->right);
deleteNode(node);
}
}
void deleteNode(Node* node)
{
delete node;
node = NULL;
}