为什么这个递归函数只设置一次?

时间:2018-01-11 18:33:39

标签: java recursion

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

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

当头变为空时,它返回节点并将头部的左子节点或右子节点设置为节点。

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

还有一个问题,当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;
}

2 个答案:

答案 0 :(得分:2)

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

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

新的node将以这样一种方式插入,即树的depth-first in-order traversal将产生一个递增的整数序列。

  

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

它设置沿递归的路径上从根节点到插入节点的位置的所有树节点。但是,只有第一个赋值才有意义,因为所有其他赋值只是设置了相同的节点而没有改变。

  

为什么这个递归函数没有将所有左子节点或右子节点设置为节点,即使它的递归函数也是如此?

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

  

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

recursion exit condition会阻止head上的任何操作,如果它的值为null - 它会将您要插入的node返回到之前的element_of实际插入发生的递归调用。

答案 1 :(得分:1)

在大多数情况下,{p> 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)