如何删除由节点组成的树,并相互指向彼此的指针?
How does one go about deleting a tree made up of nodes with pointers to each other?
我有一个类,它是由具有父级、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);
}
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- 混叠和指针互转换性
- 如何破坏包含自指指针的对象
- 指您不拥有的"std::unique_ptr"(使用原始指针?
- 互锁交换与互锁交换指针
- COM互操作传递了错误的指针,我的数据只有一个字节
- 我的c++和c#互操作在64位崩溃了,为什么?指针的大小
- 关于指针对齐,有没有一种方法可以使指针与给定的内存边界对齐