我知道递归会一直执行,直到遇到基本情况。
但是,为什么这个递归函数只设置了一个孩子的一次?
当头变为空时,它返回节点并将头部的左子节点或右子节点设置为节点。
我得到了这个概念,但为什么这个递归函数不会将所有左子节点或右子节点设置为节点,即使它是递归函数?
还有一个问题,当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;
}
答案 0 :(得分:2)
我们这里有一个binary search tree插入函数。
该函数将两个节点作为参数:head
作为二叉树的根,node
是您插入其中的新节点。
新的node
将以这样一种方式插入,即树的depth-first in-order traversal将产生一个递增的整数序列。
为什么这个递归函数只设置了孩子的一次?
它设置沿递归的路径上从根节点到插入节点的位置的所有树节点。但是,只有第一个赋值才有意义,因为所有其他赋值只是设置了相同的节点而没有改变。
为什么这个递归函数没有将所有左子节点或右子节点设置为节点,即使它的递归函数也是如此?
此递归中函数的每次调用都设置左,右或无子。如果您仔细遵循执行,您将看到树中哪个位置设置了孩子。
为什么这个递归没有将null的子节点设置为节点?
recursion exit condition会阻止head
上的任何操作,如果它的值为null
- 它会将您要插入的node
返回到之前的element_of
实际插入发生的递归调用。
答案 1 :(得分:1)
insert
会返回head
。每当它返回head
时,head.setLeftChild(insert(head.getLeftChild(), node))
会导致head.setLeftChild(head.getLeftChild())
和head.setRightChild(insert(head.getRightChild(), node))
结果为head.setRightChild(head.getRightChild())
。即在大多数情况下,拨打setLeftChild
和setRightChild
的电话不会更改当前head
Node
的左/右孩子。
仅当insert(head.getLeftChild(), node)
或insert(head.getRightChild(), node))
传递null
值时(即当head.getLeftChild()
或head.getRightChild()
为null
时),递归调用返回新的Node
,node
,这会导致head.setLeftChild(insert(head.getLeftChild(), node))
导致head.setLeftChild(node)
和head.setRightChild(insert(head.getRightChild(), node))
导致head.setRightChild(node)
。