有人可以向我解释这个二进制搜索树高度函数吗?

时间:2014-11-10 15:08:33

标签: tree height binary-search-tree

所以我一直在看这个功能,这对我来说毫无意义。

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 = ... 但孩子没有孩子,所以会发生什么?我根本不理解

3 个答案:

答案 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语句存在的原因)。