我大多以树木遍历为单位进行了递归编程,但是我的理解只有很小的差距,我想澄清。当第一个递归方法调用将节点指针一直移到左侧时,为什么存在无效节点会导致该方法停止在最后一个节点,然后移动递归调用并打印最后一个节点。我的一部分只能接受这就是发生的事情,但是我真正没有得到的就是为什么一旦您打印了最后一个左节点,为什么它会向右移动,就像对待最近打印的节点一样它处理空节点。在我看来,它会继续向左移动,好像一再撞墙。我不确定自己在解释我没有得到的内容的能力,如果不清楚,我会很乐意尝试重塑并使用图片。我认为树上的递归是非常标准的,尽管我知道有两个执行相同功能的实现,但是我将添加我在Java中使用的方法代码确定。
public void print(Node<E> e){
if (e != null) {
print(e.left);
System.out.println(e.element);
print(e.right)
}
}
为什么存在一个无效节点的事实导致方法在最后一个节点停止,经过递归调用并打印最后一个节点
只要您尚未到达最左端节点,您就会继续致电print(e.left)
。一旦到达左节点,该节点的e.left
将是null
,print(null)
将结束递归。返回后,System.out.println(e.element);
将打印左最节点。
为什么一旦打印出最后的左节点,为什么它会向右移至右
然后将执行print(e.right)
。如果左节点最有一个右孩子,则print(e.right)
将递归打印该右子树的子树。否则,它将执行print(null)
,结束该路径上的递归。
一旦左节点的 print()
返回,您就可以返回到该节点的父级的print()
,因此您致电该父节点的System.out.println(e.element);
,依此类推,等等...