通过递归方法跟踪激活记录

时间:2017-04-10 14:37:02

标签: java recursion data-structures binary-search-tree

因此,为了学习背后递归思想的非常好的逻辑,我在使用调试器研究数据结构时练习。问题似乎很容易,但它只会引起轰动。该方法在二叉搜索树中查找最大元素。 - 通常,二叉搜索树(click here用于完全实现)是一个树,其中左子元素的元素少于根元素,右子元素的元素高于根元素。 - 在找到它之前,该方法进入新的激活框架并将其推到堆栈的顶部。被发现后,它们会以逆序(LIFO)弹出。我的问题是为什么该方法返回第二个语句(return findMax(node.right))?如果调试器显示弹出的激活帧,为什么它只显示一次?我希望图像有助于更好地理解我的问题。

enter image description here

/* bST.add(1),bST.add(3),bST.add(7),bST.add(6),bST.add(4),
   bST.add(13),bST.add(14),bST.add(10),bST.add(8); */

/**
 * Find max element in the BST
 * @param node local node being given
 * @return max element
 */
public E findMax(Node<E> node) {
        if (node.right == null)
            return node.data;
        return findMax(node.right);
}

enter image description here

1 个答案:

答案 0 :(得分:0)

代码在树的右侧工作,直到它击中最大的元素:没有正确子元素的元素。然后它将该节点的数据值 - 返回给调用它的实例。那是从节点13调用的实例。

特定语句 return node.data 是此递归的基本情况。第二个,返回findMax(node.right),是递归情况。当您达到值 14 时,您将其中四个返回堆叠起来,等待结果。

来自节点13的那个将然后将值 14 传递回来自节点7的呼叫,继续向下移动,直到来自节点1的呼叫返回值 14 至于所谓的 findMax

我不知道为什么你的调试器只显示第一次激活&#34; pop&#34;的证据。我不知道你正在使用什么设置。如果您是单步执行,或者在返回(以及 findMax 调用)中设置了断点,您应该看到两端:在另一个级别,然后以LIFO顺序重新开始。

这能为你清理什么吗?