所以我一直在看这个功能,这对我来说毫无意义。
int findHeight(BinaryNode<E> aNode)
{
if(aNode ==null){
return -1;
}
int lefth = findHeight(aNode.left);
int righth = findHeight(aNode.right);
if(lefth > righth)
return lefth + 1;
else
return righth +1;
}
假设我有一棵树,由一个只有一个孩子的一个根组成。所以root-&gt; LeftChild。
我们运行此方法。 root isnt null所以我们继续int lefth = ... 当我们进入int Lefth时,我们再次运行相同的方法,但左边的孩子作为参数。 leftchild不为null所以我们继续int lefth = ... 但孩子没有孩子,所以会发生什么?我根本不理解
答案 0 :(得分:0)
最终aNode.left
将在树中成为null
,因此递归将停止。
此时,递归堆栈(findHeight root -> findHeight root.left -> findHeight root.left.left [null]
)将被解析为一个数字。
“最终”评估将是这样的
-1 [null] + 1 [root.left] + 1 [root] = 1
因此高度将为1(仅对根的一个左子,这是正确的)
为简单起见,我将if / else排除在此示例之外。
答案 1 :(得分:0)
一旦你打电话给&#34;孩子&#34;如果为叶子节点,则为空,您点击第一个if语句并返回-1。然后在堆栈的每个递归调用中添加1,包括1对于不存在的null子项。因此,该方法返回高度。
答案 2 :(得分:0)
这是一个递归函数(它自称)。要了解它是如何工作的,首先必须想象它的作用。
首先,将每个BinaryNode视为新子树的根。您可以在树中的任何节点上调用findHeight
,它将返回该子树的高度。
当函数执行时,它调用自身来查找子树中每个左右节点的高度。只要该节点不是null
(表示树的叶子),它就会继续向下移动一个分支,直到它到达一个空的节点,此时它将return
一个值为-1(因为空节点不算作树高度的一部分)。
然后,它将开始return
将树备份到根节点。当它从分支中的每个节点返回时,它将返回值加1。当它到达顶部时,将返回的是最长分支中所有高度的总和(这就是if
语句存在的原因)。