二叉树numNodes

时间:2009-06-09 00:18:42

标签: c++

int numNodes() const {
   int size = 1;

   if (left != NULL) size += left->numNodes();
   if (right != NULL) size += right->numNodes();

   return size;
}

上面的代码是查找树内节点数的代码,因为它使用递归调用,我真的不明白它的作用。任何人都可以解释上面的递归调用或函数是如何工作的。感谢


另见:

5 个答案:

答案 0 :(得分:4)

理解递归的关键之一是注意到你一遍又一遍地解决同样的问题。

原始问题是“此树中有多少个节点?”您可以通过添加左子树和右子树中的节点来解决此问题。现在你有两个小问题:计算节点在左右子树中。

这就是技巧:这两个较小的问题(计算子树中的节点)几乎与您开始使用的问题相同(计算所有节点)。唯一的区别是子树比原始树略小。

一个聪明的递归算法,就像你发布的算法一样,将利用这些问题之间的相似性来解决问题,只需很少的代码。

首先,递归代码很难引起你的注意。组成一个示例树并通过它来假装成计算机,直到你相信它为止。

答案 1 :(得分:2)

递归函数是一个调用自身的函数。

我们以你提供的例子为例:

  1. 从顶部节点开始,因此大小为1.每个节点都有一个左右树。
  2. 如果存在左侧树,请在左侧树中添加节点数。
  3. 如果存在右节点,请在右侧树中添加节点数。
  4. 返回尺寸。
  5. 步骤2和3使用递归,因为它们再次调用函数,但使用子节点。我不确定这是否是技术上的递归,因为调用的函数属于不同的对象。无论如何,我们来看一个示例数据集。

    让我们看一下这棵树:

    a
    |\
    b c
    | |\
    d e f
    
    1. 我们首先调用a.numNodes(),此时大小为1。
    2. a.left是b,所以我们称之为b.numNodes()。
    3. b.left是d,所以我们调用d.numNodes()。
    4. d.left和d.right为空,所以我们返回1.
    5. b.right为null,因此它的叶子的总重量为1,我们将其添加到原始大小1,因此b.numNodes返回2.
    6. 我们回到a,a.right是c,所以我们称之为c.numNodes()。
    7. c.left是e,e.numNodes()返回1,我们将其添加到f.numNodes()以获得2,然后我们为c添加1,并返回3.
    8. 现在a.left.numNodes()= 2和a.right.numNodes()= 3,添加5并为a添加1,得到树中6个节点的最终结果。
    9. 希望这有帮助!

答案 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
  1. 您在根节点上调用numNodes 乙
  2. 在B中设置size = 1,调用 左子节点上的numNodes(A)
  3. 在A中,因为它是叶子节点 返回大小1
  4. B节点中的
  5. 在右侧调用numNodes 节点(C)
  6. 在C中,因为它是叶子节点 返回大小1
  7. B中的
  8. (left-> numNodes()返回1, right-> numNodes()返回1)加1 并返回3

答案 4 :(得分:1)

此代码以size = 1开头,然后每次找到不等于NULL的节点时递增大小。

if (left != NULL) size += left->numNodes();

如果左节点不是numNodes,则此语句调用左节点的NULL函数,然后返回左节点的大小,并将大小增加左节点的大小

对于正确的节点也是如此。