如何删除分支因子不一致的树,最大为 30,40

How do I delete a tree with an inconsistant branching factor up to 30,40

本文关键字:不一致 何删除 删除 分支      更新时间:2023-10-16

如果树的最大分支因子为 2,我知道如何逐个节点删除整个树。基本上是尽可能向右走,然后尝试向左走。直到您达到左右 ptr = NULL 的点。如果树的最大分支因子为 40,我真的不知道如何在代码中执行此操作。

这是我删除和查找树的最高深度的代码。

int FindDepth(Node* root, bool GoingRight, int Depth = 0, int DepthCompare = 0) {
if (GoingRight) {
// If we have reached an end
if (root->right == NULL) {if (Depth > DepthCompare)DepthCompare = Depth; }
// If space continue going right
else DepthCompare = FindDepth(root->right, true, Depth + 1, DepthCompare);
// Time for going left
GoingRight = false;
}
if (!GoingRight) {
// If we have reached an end
if (root->left == NULL) {if (Depth > DepthCompare)DepthCompare = Depth; }
// If space try going right
else DepthCompare = FindDepth(root->left, true, Depth + 1, DepthCompare);
}
delete root;
return DepthCompare;
}

如果我有一个最多 40 个孩子的节点,任何提示。

应用深度优先搜索在这里看起来很方便。您只需将每个节点的子节点添加到堆栈中,当堆栈不为空时,您可以弹出一个节点并对其执行相同的操作,直到到达可以删除的叶节点。

一个很好的实现 C++ 来自 geeksforgeeks 这里。

这里唯一的区别是,您将其应用于树,因此无需担心周期。您应该直接到达一个叶节点,您可以安全地删除该节点。

如果树的最大分支因子为 2,我知道如何逐个节点删除整个树。基本上是尽可能向右走,然后尝试向左走。直到您达到左右 ptr = NULL 的点。

对于任何内容的最大分支因子,只需要进行两项更改:

基本上尽可能向右走,然后尝试向右转第二,向右第三,...,向右(又名左(。直到你达到所有ptr == NULL 的点。

不过,我不会尝试将这些更改楔入您的代码中。该代码具有许多硬编码的假设,因此最好重新启动。(例如,将GoingRight设为bool假定只有两个选择。另一方面,GoingRight并不是那么有用,因为它总是作为true传入,并且总是在检查if(!GoingRight)之前设置为false考虑循环而不是一个接一个地写出案例(即而不是向右走,然后向左走(。树存储指向其子项的指针的方式应有助于指导代码。

如果你只需要删除一棵树,并且你保留了对子项的引用,例如,在数组中,你可以编写非常简单的代码:

const int BranchingFactor = 40;
struct Node
{
Node * Children[BranchingFactor];  
};
void DeleteSubTree(Node * root)
{
if (root != NULL)
{
for (int childNumber = 0; childNumber < BranchingFactor; childNumber++)
DeleteSubTree(root->Children[childNumber]);
delete root;
}
}