二叉树上的递归删除
recursive delete on a binary tree
我试图了解二叉搜索树删除的递归方法是如何工作的。我在很多地方遇到的代码如下所示:
void destroy_tree(struct node *leaf)
{
if( leaf != 0 )
{
destroy_tree(leaf->left);
destroy_tree(leaf->right);
free( leaf );
}
}
我不能理解然而a)如果在例程中没有返回,它是如何工作的?B) free()何时被调用?我想到,例如,这样一棵树:
10
/
6 14
/ /
5 8 11 18
所以我的理解是我遍历10->6->5,然后调用destroy_tree(5->left)。因此,if内部的leaf为NULL,并且不执行与if相关的内容,因此5不会被删除。我在这个推理中哪里出错了?卷绕和unwind是如何工作的呢?任何帮助都非常感谢:-)
在那个点是这样的:
void destroy_tree(struct node *leaf_5)
{
if( leaf_5 != 0 ) // it's not
{
destroy_tree(leaf_5->left); // it's NULL so the call does nothing
destroy_tree(leaf_5->right); // it's NULL so the call does nothing
free( leaf_5 ); // free here
}
}
不需要返回…步骤的"历史记录"位于调用堆栈中,此时看起来像这样:
destroy_tree(leaf_10)
destroy_tree(leaf_10->left, which is leaf_6)
destroy_tree(leaf_6->left, which is leaf_5)
所以在leaf_5消失后,它回到堆栈并执行destroy_tree(leaf_6->right, which is leaf_8)
…等等…
函数的基本工作原理:
void destroy_tree(struct node *leaf)
{
if( leaf_5 != 0 ) // it's not
{
destroy_tree(leaf->left);
// Traverse the tree all the way left before any of the code below gets executed.
destroy_tree(leaf->right);
// Traverse the tree all the way right from the final left node before any of
//the code below gets executed
free( leaf ); // Free the final node
}
}
下面是递归删除的完整实现代码:
void DeleteNode(TreeNode*& tree);
void Delete(TreeNode*& tree, ItemType item);
void TreeType::DeleteItem(ItemType item)
// Calls the recursive function Delete to delete item from tree.
{
Delete(root, item);
}
void Delete(TreeNode*& tree, ItemType item)
// Deletes item from tree.
// Post: item is not in tree.
{
if (item < tree->info)
Delete(tree->left, item); // Look in left subtree.
else if (item > tree->info)
Delete(tree->right, item); // Look in right subtree.
else
DeleteNode(tree); // Node found; call DeleteNode.
}
void GetPredecessor(TreeNode* tree, ItemType& data);
void DeleteNode(TreeNode*& tree)
// Deletes the node pointed to by tree.
// Post: The user's data in the node pointed to by tree is no
// longer in the tree. If tree is a leaf node or has only one
// non-NULL child pointer, the node pointed to by tree is
// deleted; otherwise, the user's data is replaced by its
// logical predecessor and the predecessor's node is deleted.
{
ItemType data;
TreeNode* tempPtr;
tempPtr = tree;
if (tree->left == NULL)
{
tree = tree->right;
delete tempPtr;
}
else if (tree->right == NULL)
{
tree = tree->left;
delete tempPtr;
}
else
{
GetPredecessor(tree->left, data);
tree->info = data;
Delete(tree->left, data); // Delete predecessor node.
}
}
void GetPredecessor(TreeNode* tree, ItemType& data)
// Sets data to the info member of the rightmost node in tree.
{
while (tree->right != NULL)
tree = tree->right;
data = tree->info;
}
相关文章:
- 从类型列表中递归删除重复项会导致编译器堆空间错误 (VS2017)
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- C++删除/(递归)对象销毁问题
- 在c++中使用递归从字符串中删除所有辅音
- 如何递归删除Qt3DWindow根实体中的所有节点?
- 递归树遍历/分支删除的隔离错误
- 以递归方式从链表中删除节点
- 如何使用 Boost Hana 删除元编程递归
- 如果 x,递归不起作用,我的函数只能删除第一个元素
- 编写递归算法以从链表中删除元素.编写递归算法以将元素添加到链表中
- 递归删除预处理器宏
- 从链接列表(通过递归)中删除元素
- 递归模板参数删除
- 不太清楚为什么我的递归链表删除函数有效?我很想解释一下
- 是否可以从此函数中删除递归
- 如何使用递归删除二叉搜索树中的节点
- 如何在没有递归的情况下删除链接列表
- C++无法在递归中删除对象的常量
- 如何在visual C++2013上递归删除二叉树
- 共享指针递归地删除递归数据结构,堆栈溢出