我已经实现了使用递归查找二叉树大小的函数(参考有关数据结构和算法的书)
代码段如下:
// 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,这是正确的)。
答案 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 没有左,没有右子,因此leftCount
和rightCount
都设置为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),我首先解释了在高级别找到大小的过程,然后显示代码,然后运行代码一步一步地举例说明(通过在每个函数调用中填充变量值的表,所以很容易看出递归是如何解开的。)