遍历二叉搜索树C++
traversing binary search tree C++
我正在做一个编程作业,并编写了一堆函数来实现二叉搜索树,并给出了一些函数。我以为我理解递归,但如果你愿意的话,我一直在切换方向。
这是赋值给出的函数:
static void deleteAll(BSTNode<Data>* n) {
if (0 == n) return;
deleteAll(n->left);
deleteAll(n->right);
delete n;
}
要删除一棵非常短的树,
根 / \左撇子 右
我打电话给deleteAll(root)
. n != 0
所以现在我打电话给deleteAll(lefty)
. n != 0
所以我打电话给deleteAll(lefty->left)
.当然没有左节点。当我添加左节点时,我的构造函数将左、右和父指针初始化为 0,所以现在n == 0
.所以我返回函数并且永远不会删除右边。我怎么去deleteAll(n->right)
?
正如我所说,提供了此功能,所以我不应该更改它。我想也许我必须调用deleteAll(b.begin())
或b.end()
才能从最左边或最右边的节点开始,但每次我在脑海中浏览它时,我都会点击n == 0
。
请帮助我理解。
想象一个指向当前正在执行的行的箭头。当我们调用 deleteAll(root)
时,首先我们检查 root
是否为 0:
--> if (0 == root) return;
deleteAll(root->left);
deleteAll(root->right);
delete root;
因为root != 0
,我们称之为deleteAll(root->left)
:
if (0 == root) return;
--> deleteAll(root->left); /*
|-1-> if (0 == lefty) return;
|-2-> deleteAll(lefty->left);
|-3-> deleteAll(lefty->right);
|-4-> delete lefty; */
deleteAll(root->right);
delete root;
}
现在箭头将移回函数的顶部并开始对lefty
执行相同的操作,运行我评论中的第 1-4 行(在第 2 行,相同的扩展将再次发生,直到找到空节点)。但这里重要的是,它会记住它在函数调用之前的位置,以便以后可以恢复。所以deleteAll(root->left)
会去做它所做的事情,最终会回来。然后原始调用继续:
if (0 == root) return;
deleteAll(root->left);
--> deleteAll(root->right);
delete root;
现在,正确的节点也被删除了。这发生在递归的每一步。请记住,return
只返回当前函数,而不是整个递归链。
返回仅返回到调用它的函数。在deleteAll(lefty)
的情况下(如果我理解正确,要么是那个,要么是deleteAll(root)
)。 deleteAll(n->right)
将在deleteAll(n->left)
返回后接到电话。删除全部的后置条件是 n 及其所有子项都将被删除。
假设我们有以下树:
a
/
b c
/
d e
调用图将如下所示:
deleteAll(a)
deleteAll(a->left)
deleteAll(a->left->left)
deleteAll(a->left->left->left)
deleteAll(a->left->left->right)
deleteAll(a->left->right)
deleteAll(a->right)
deleteAll(a->right->left)
deleteAll(a->right->right)
deleteAll(a->right->right->left)
deleteAll(a->right->right->right)
或者就节点名称而言:
deleteAll(a)
deleteAll(b)
deleteAll(d)
deleteAll(NULL)
deleteAll(NULL)
deleteAll(NULL)
deleteAll(c)
deleteAll(NULL)
deleteAll(e)
deleteAll(NULL)
deleteAll(NULL)
- 有根的二进制搜索树.保留与其父级的链接
- 正在尝试重载二进制搜索树分配运算符
- 使用C++创建特殊的二叉搜索树
- 在递归二叉搜索树中搜索
- 在二叉搜索树中插入时出现分段错误
- C++二叉搜索树模板从函数返回节点
- 我可以在没有堆栈的情况下在二叉搜索树中实现迭代器吗?
- 在二叉搜索树C++中计算平均值
- 在字符串的二叉搜索树中搜索子字符串 - C++
- 在二叉搜索树中插入新元素
- 如何打印在二叉搜索树中找到的数据?
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数
- 这是一个二叉搜索树吗?黑客排名问题
- 二叉搜索树 - 实现"search"函数
- 二叉搜索树的 C++ 实现中的EXC_BAD_ACCESS错误
- 删除二叉搜索树 (C++) 中的单个元素
- 将值存储在带有C++的二叉搜索树中
- 二叉搜索树未将插入值加载到树中
- 二叉搜索树使用最常用的节点来打印出某些语句
- 如何以特定格式C++打印二叉搜索树