有人可以准确解释这种递归是如何工作的吗? 我们计算左子树和右子树的大小,但是左子树的右侧(即右子)的节点呢?另外,为什么我们每次调用时都会添加1?
int size(struct node* node) // We pass root
{
if (node==NULL)
return 0;
else
return(size(node->left) + 1 + size(node->right));
}
答案 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.否则,至少有一个顶点(根)加上许多顶点包含在从根垂下的任何子树中。这导致了两种计算大小的方案:
[the size of the left subtree] + [the size of the right subtree] + 1 (for the root vertex itself)
。此时您需要认识到子树本身就是一个树。你还需要采取信仰的递归跳跃" size()
是一个返回树大小的函数,而不用担心它是如何设置的。如果您可以接受这一点,那么突然变得明显可以通过调用左子树上的size()
函数,在右子树上调用它,对结果求和,以及添加来计算上面概述的第二种情况。 1表示当前(子)树的根目录!对于左侧和右侧,如果没有子树,则返回的贡献将为零。否则,请相信该函数以交回该子树的大小并使用结果来计算当前(子)树的大小,然后通过return
语句将其交给任何调用您的人。