使用递归的二叉树的大小

时间:2015-01-11 19:03:54

标签: recursion binary-tree

有人可以准确解释这种递归是如何工作的吗? 我们计算左子树和右子树的大小,但是左子树的右侧(即右子)的节点呢?另外,为什么我们每次调用时都会添加1?

int size(struct node* node) // We pass root 
{
   if (node==NULL) 
      return 0;
   else    
      return(size(node->left) + 1 + size(node->right));  
}

2 个答案:

答案 0 :(得分:3)

这就是递归的工作原理。

int size(struct node* node) // We pass root 
{
if (node==NULL) 
return 0; //if the current node is null return a 0 so no add 1 is done
else    
return(size(node->left) + 1 + size(node->right));  
}

让我们分开return语句

返回

size(node-> left)递归调用当前节点的左节点

当前节点的

+1

size(node-> right)递归调用当前节点的右边节点

到递归完成时,它将返回整个树的当前大小

如果我们从树的头部开始,它将递归调用左子树,直到它达到null,为该节点返回0,因此没有为它完成添加1,然后返回1级调用右子最后一个节点的树不为空并继续运行直到整个树完成,每个树都加1,只有每个非空节点。

示例

        5

    3       8

1      4 7     9

是树

递归从5开始

它有左右子树

左边叫第3个 三个有左右子树 先走了 所以它转到1。 1没有子树,但1不为空,因此它调用返回0的左子树

0 + 1 + 0是1节点返回值,为1。

然后又回到3

3有一个正确的子树,所以它称之为

4没有子树,所以它的返回值将是0 + 1 + 0

现在回到3 它的回报率为1 + 1 + 1

现在回到5,所以3节点的返回将是3

所以现在在递归中它将是3 + 1 + size-> right

它将以递归方式返回正确的子树,以便返回

3 + 1 + 3,即7个节点不为空

答案 1 :(得分:0)

每个二叉树都有一个根。根可以为null,在这种情况下,这个树是空的并且大小为0.否则,至少有一个顶点(根)加上许多顶点包含在从根垂下的任何子树中。这导致了两种计算大小的方案:

  • 如果根顶点为空,则此树的大小为零,故事结束。
  • 如果它不为null,则根顶点是两个子树的父,左子树和右子树。无论子树是否为空,树的总大小将为[the size of the left subtree] + [the size of the right subtree] + 1 (for the root vertex itself)

此时您需要认识到子树本身就是一个树。你还需要采取信仰的递归跳跃" size() 一个返回树大小的函数,而不用担心它是如何设置的。如果您可以接受这一点,那么突然变得明显可以通过调用左子树上的size()函数,在右子树上调用它,对结果求和,以及添加来计算上面概述的第二种情况。 1表示当前(子)树的根目录!对于左侧和右侧,如果没有子树,则返回的贡献将为零。否则,请相信该函数以交回该子树的大小并使用结果来计算当前(子)树的大小,然后通过return语句将其交给任何调用您的人。