【问题标题】:Why does this recursion function only set once?为什么这个递归函数只设置一次?
【发布时间】:2018-01-11 18:33:39
【问题描述】:

我知道递归会一直执行,直到满足基本情况。

但是,为什么这个递归函数只设置了一次head的孩子呢?

当head变为null时,它返回节点并将head的左孩子或右孩子设置为节点。

我明白了这个概念,但是为什么即使它是递归函数,这个递归函数也不会将所有左孩子或右孩子都设置为节点?

还有一个问题,这个递归在head为null的时候就停止了,但是为什么这个递归不把null的孩子设置为节点呢?此递归将 null 的头的前一个子节点设置为节点。为什么会这样?

public Node<Integer> insert(Node<Integer> head, Node<Integer> node){
    if(head == null){
        return node;
    }

    if(head.getData() >= node.getData()){
        head.setLeftChild(insert(head.getLeftChild(), node));
    } else {
        head.setRightChild(insert(head.getRightChild(), node));
    }

    return head;
}

【问题讨论】:

  • null 怎么有头有子?
  • 是的,我明白了,马特。所以在递归函数中,如果我们想要执行某些东西,如果它无法执行,我们就进入堆栈的下一个并执行它?我只是想验证我的假设。
  • 仔细阅读你的源代码,原因很明显,如果你仍然看不到,“分析”if块,问题就在那里
  • @Dummy 这对我来说并不明显。你为什么不发布完整的答案?
  • 我希望你自己弄清楚,但如果你坚持,那就是,当空检查为真时,你永远不会将head 设置为任何东西,所以无论如何它总是null

标签: java recursion


【解决方案1】:

我们这里有一个binary search tree 插入函数。

该函数接受两个节点作为参数:head 是二叉树的根,node 是您要插入其中的新节点。

新的node 将以这样的方式插入:树的depth-first in-order traversal 将产生一个升序的整数序列。

为什么这个递归函数只设置head的孩子一次?

它设置从根节点到插入节点位置的路径上的所有树节点,以退出递归。不过,只有第一个赋值是有意义的,因为所有其他赋值都只是设置相同的节点而没有更改。

为什么这个递归函数不把所有的左孩子或右孩子都设置为节点,即使它是递归函数?

此递归中函数的每次调用都会设置左、右或无子。如果您仔细执行,您将看到在树中的哪个位置设置了哪个子节点。

为什么这个递归不将 null 的子节点设置为节点?

如果head 的值为nullrecursion exit condition 会阻止对head 的任何操作 - 它会将您要插入的node 返回到实际插入发生的上一个递归调用。

【讨论】:

    【解决方案2】:

    insert 在大多数情况下返回head。每当它返回 head 时,head.setLeftChild(insert(head.getLeftChild(), node)) 的结果是 head.setLeftChild(head.getLeftChild())head.setRightChild(insert(head.getRightChild(), node)) 的结果是 head.setRightChild(head.getRightChild())。即在大多数情况下,对setLeftChildsetRightChild 的调用不会更改当前head Node 的左/右孩子。

    只有当insert(head.getLeftChild(), node)insert(head.getRightChild(), node)) 被传递一个null 值(即当head.getLeftChild()head.getRightChild()null)时,递归调用才会返回新的Nodenode,这导致head.setLeftChild(insert(head.getLeftChild(), node)) 导致head.setLeftChild(node)head.setRightChild(insert(head.getRightChild(), node)) 导致head.setRightChild(node)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 2021-08-26
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多