如何删除由节点组成的树,并相互指向彼此的指针?

How does one go about deleting a tree made up of nodes with pointers to each other?

本文关键字:互指 指针 删除 节点 何删除      更新时间:2023-10-16

我有一个类,它是由具有父级、leftChild 和 rightSibling 指针的节点组成的树。我的目的是从下到上删除树。按照我目前设置的方式,节点不会被"删除",因为指向它们的节点仍然指向该位置,这应该不会导致错误。

任何帮助将不胜感激。我环顾四周,但没有找到与我类似的情况。

OrgTree::~OrgTree()
{
TreeNode * curr = root;
while (curr->leftChild != nullptr)
{
if (curr->leftChild != nullptr)
{
curr = curr->leftChild;
}
}
while (root != nullptr)
{
if ((curr == root) && (curr->leftChild == nullptr))
{
delete(curr);
}
else
{
if (curr->leftChild == nullptr)
{
curr = curr->parent;
}
TreeNode * temp = curr->leftChild;
TreeNode * prev = curr;
while (temp->rightSibling != nullptr)
{
prev = temp;
temp = temp->rightSibling;
if (temp->rightSibling == nullptr)
{
prev->rightSibling = nullptr;
}
}
while (temp->leftChild != nullptr)
{
prev = temp;
temp = temp->leftChild;
if (temp->leftChild == nullptr)
{
prev->leftChild = nullptr;
}
}
delete(temp);
}
}
}

好的,所以...您的算法如下所示:

  • 前往最深、最左边的节点。
  • 上移 (1( 到父级
  • 前往该节点
  • 的最右侧同级,然后取消该节点与上一个节点的链接
  • 前往该节点
  • 最深处的最左侧节点,并取消该节点与上一个节点的链接
  • 删除您登陆的任何节点

我的第一个想法是在分配节点并从列表中删除节点时使用std::vector<TreeNode*>。 如果我在构建树之前知道我需要多少节点,我甚至可能会想使用std::vector<TreeNode>并分发像&myVector[mCursor++]这样的指针。


但是,如果我们要使用完全动态的路由并避免在分配节点时跟踪节点的预先步骤,那么您尝试执行的操作称为后序遍历。 二叉树的后序遍历有几种算法,包括没有递归的算法。 这是一个使用堆栈的(尽管您应该使用std::stack<TreeNode*>(。

下面是递归代码源:

/* Given a binary tree, delete its nodes according to the
"bottom-up" postorder traversal. */
static void deletePostorder(TreeNode* node)
{
if (node == NULL)
return;
// first recur on left subtree
deletePostorder(node->leftChild);
// then recur on right subtree
deletePostorder(node->rightSibling);
// now deal with the node
delete node;
}
OrgTree::~OrgTree()
{
deletePostorder(root);
}

你能控制 TreeNode 吗?

如果是这样,你可以让 TreeNode 析构函数删除它们的左右子级,而你的顶级析构函数只是

OrgTree::~OrgTree() {
delete(root);
}