【发布时间】:2019-05-03 22:02:05
【问题描述】:
我构建了一棵二叉树,它的每个右孩子都可能与其兄弟的左孩子相同。当我试图删除它时,我不确定整个树是否被完全删除。
class TreeNode
{
public:
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int v)
{
val = v;
left = NULL;
right = NULL;
}
~TreeNode()
{
//testing if our tree is correct;
cout<<val<<" ";
delete left;
delete right;
}
};
/*
2
4, 3
3, 2, 6
2, 9, 5, 2
10, 5, 2, 15, 5
*/
// 2->4 2->3 4->3 4->2 3->2 3->6
删除根目录;
所以,如您所见,我在删除节点值时打印它,但我的结果看起来像这样 {2 4 3 2 10 5 9 5 2 2 9 5 2 5 2 15 3 2 9 5 2 5 2 15 6 5 2 15 2 15 5},似乎当我们试图删除假设被删除为另一个节点的右孩子的左孩子时,系统仍然可以访问该节点并打印结果。我的意思是,它应该已经是 NULL 了吧?
【问题讨论】:
-
delete没有将已删除的指针设置为NULL,看来你有一个误解。 -
请确认。在第 2 层,4 和 3 都指向第 3 层的 2?如果是这样,您需要清理您的所有权。对于删除者,汉兰达定律完全有效。只能有一个。
-
删除任何类型的指针不会将其设置为 nullptr。如果你想这样做,你必须添加一行来明确地这样做。允许删除 nullptr。
-
删除 4 后将 3 指向 2 的指针设为空非常棘手。指针没有反向通道,也无法知道还有谁指向刚刚删除的分配。您可能会发现
std::shared_ptr在这里很有帮助。 -
你描述的数据结构不是树。在树中,一个节点只能有一个父节点。
标签: c++