int numNodes() const {
int size = 1;
if (left != NULL) size += left->numNodes();
if (right != NULL) size += right->numNodes();
return size;
}
上面的代码是查找树内节点数的代码,因为它使用递归调用,我真的不明白它的作用。任何人都可以解释上面的递归调用或函数是如何工作的。感谢
答案 0 :(得分:4)
理解递归的关键之一是注意到你一遍又一遍地解决同样的问题。
原始问题是“此树中有多少个节点?”您可以通过添加左子树和右子树中的节点来解决此问题。现在你有两个小问题:计算节点在左右子树中。
这就是技巧:这两个较小的问题(计算子树中的节点)几乎与您开始使用的问题相同(计算所有节点)。唯一的区别是子树比原始树略小。
一个聪明的递归算法,就像你发布的算法一样,将利用这些问题之间的相似性来解决问题,只需很少的代码。
首先,递归代码很难引起你的注意。组成一个示例树并通过它来假装成计算机,直到你相信它为止。
答案 1 :(得分:2)
递归函数是一个调用自身的函数。
我们以你提供的例子为例:
步骤2和3使用递归,因为它们再次调用函数,但使用子节点。我不确定这是否是技术上的递归,因为调用的函数属于不同的对象。无论如何,我们来看一个示例数据集。
让我们看一下这棵树:
a
|\
b c
| |\
d e f
希望这有帮助!
答案 2 :(得分:2)
基本上,此函数将获取当前节点(已经具有大小为1),然后在此节点的左侧和右侧添加节点数。逐行:
int numNodes() const {
声明函数numNodes()。此函数对树中的任何节点都有效,并且每个节点可能有左子节点,右子节点或两者都有。
int size = 1;
由于我们在节点上运行,因此我们知道大小将从1开始(此节点)。
if (left != NULL) size += left->numNodes();
if (right != NULL) size += right->numNodes();
获取左右子节点的节点数(如果存在)。这是递归调用 - 它在两个子节点上运行相同的方法并返回结果。如果没有子节点,numNodes()将返回1.
return size;
返回以此节点为根的树的大小。最后,在所有递归调用之后,在整个树的根上调用numNodes()将返回节点的总数。
答案 3 :(得分:1)
想象一下,你有一个根节点,左,右指针指向子节点。
算法迭代每个节点,并为每个节点计算它的大小:
size of left subnode + size of right subnode + 1 (for this node)
想象一下树:
B
/ \
A C
答案 4 :(得分:1)
此代码以size = 1
开头,然后每次找到不等于NULL的节点时递增大小。
if (left != NULL) size += left->numNodes();
如果左节点不是numNodes
,则此语句调用左节点的NULL
函数,然后返回左节点的大小,并将大小增加左节点的大小
对于正确的节点也是如此。