以递归方式查找二叉树的大小

时间:2015-08-15 08:43:54

标签: recursion data-structures binary-tree

我已经实现了使用递归查找二叉树大小的函数(参考有关数据结构和算法的书)

代码段如下:

// Returns the total number of nodes in this binary tree (include the root in the count).
public static int size(BinaryTreeNode root) {
    int leftCount = root.left == null ? 0 : size(root.left);
    int rightCount = root.right == null ? 0 : size(root.right);
    return 1 + leftCount + rightCount;
}

它也有效。 但是我无法理解leftCount和rightCount元素如何在递归函数调用之间递增?不应该像下面这样做:

// Returns the total number of nodes in this binary tree (include the root in the count).
public static int size(BinaryTreeNode root) {
    int leftCount = 0;
    int rightCount = 0;
    leftCount = leftCount + (root.left == null ? 0 : size(root.left));
    rightCount = rightCount+ (root.right == null ? 0 : size(root.right));
    return 1 + leftCount + rightCount;
}

由于某些原因,这两个函数对于下面的二叉树产生相同的结果(7,这是正确的)。

Example Problem

2 个答案:

答案 0 :(得分:0)

原始代码看起来正确并返回正确的答案。您的可选代码更加冗长 - 它的工作方式相同。记住,leftCount和rightCount是每个递归调用的独立变量。

我唯一的建议是将传递给size()函数的参数名称从root更改为node。这清楚地表明,相同的函数可以在除根节点之外的节点上运行,并且递归变得更容易理解。

答案 1 :(得分:0)

让我尝试通过使用代码来解释它是如何工作的 你展示的二叉树。

首先使用根节点( 1 )调用size。其左孩子( 2 )不是null,因此您使用 2 致电size。其左孩子( 4 )不是null,因此您使用 4 致电size。现在, 4 的左侧是null,因此您将leftCount设置为0 4 的权利也是null,因此您将rightCount设置为0。然后,将1 + 0 + 0 1返回给调用函数,该函数是节点 2 的函数。因此,使用节点 2 调用的函数中的leftCount设置为1。现在,我们检查 2 的正确孩子,而不是null,因此我们将size与其正确的孩子( 5 )联系起来。同样, 5 没有左,没有右子,因此leftCountrightCount都设置为0,函数返回1 + 0 + 0。在 2 右侧的size调用返回1后,rightCount将设置为1。此时,使用 2 调用的函数返回1 + 1 + 1,即3。因此,对 1 左侧的size的调用会返回3,然后我们会使用 1 size >( 3 )。通过节点 3 调用size,与我们在节点 2 的调用中看到的完全相同,因此计数为{{1}返回。最后,使用节点 1 的原始调用返回3,即1 + 3 + 3

如果你想要一个更直观的解释,我已经在YouTube上制作了一个视频(find size of binary tree),我首先解释了在高级别找到大小的过程,然后显示代码,然后运行代码一步一步地举例说明(通过在每个函数调用中填充变量值的表,所以很容易看出递归是如何解开的。)