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

Delete all nodes of a binary search tree

本文关键字:节点 搜索树 删除      更新时间:2023-10-16

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

如何正确地删除所有节点,我应该更好地为此编写什么析构函数?

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
}

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

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

  • 如果节点没有子节点,则它是叶节点。简单地删除。
  • 如果节点有任何子节点,删除它们。

这应该在Tree的析构函数调用的帮助函数的帮助下递归地完成。