删除二叉搜索树的所有节点

时间:2016-11-08 19:56:46

标签: c++ binary-search-tree

我有一个二进制搜索树,如下面的代码所示。例如,在程序的开头,我为一个树实例和一些节点动态分配了内存。

如何正确删除所有节点以及我应该为此更好地编写哪些析构函数?

TreeNode.h:

class TreeNode {
private:
    unsigned __int64 _id;
    string _data;

public:
    TreeNode *left;
    TreeNode *right;
    TreeNode *parent;

    TreeNode(const string &str);

    TreeNode();

    ~TreeNode();
};

TreeNode.cpp

TreeNode::TreeNode(const string &str) {
    left = nullptr;
    right = nullptr;
    parent = nullptr;
    _data = str;
    _id = (unsigned __int64)this;
    cout << "\n_id=" << _id << "; \"this\"=" << hex << this << dec << endl;
    cout << "Node initialized" << endl;

}

TreeNode::TreeNode() {
    left = nullptr;
    right = nullptr;
    parent = nullptr;
    _data = "";
    _id = (unsigned __int64)this;
}

TreeNode::~TreeNode() {
    //don't know how to implement
}

tree.h中:

class Tree {

public:
TreeNode *root;
    Tree();

    Tree(TreeNode *node);

    ~Tree();
};

Tree.cpp:

Tree::Tree() {
    root = nullptr;
}

Tree::Tree(TreeNode *node) {
    root = node;
}

Tree::~Tree() {
    //don't know how to implement
}

1 个答案:

答案 0 :(得分:3)

对于节点本身,您没有为节点的任何成员分配任何内存,因此不需要在那里使用析构函数。默认就足够了。

您的实际树析构函数必须处理指针。那些占用内存所以必须删除它们。您处理每个节点的算法应如下:

  • 如果节点没有子节点,则它是叶子节点。只需删除。
  • 如果节点有任何子节点,请将其删除。

在Tree的析构函数调用的辅助函数的帮助下,这应该更好地完成。