二叉树中序遍历空return的作用及控制转移问题解析
二叉树中序遍历递归代码详解:逻辑、空return作用及控制权转移分析
先把我们要分析的代码贴出来,方便对照:
void printInorder(Node node) { if (node == null) return; printInorder(node.left); System.out.print(node.key + " "); printInorder(node.right); }
一、遍历逻辑分步拆解
中序遍历的核心规则是左子树 → 根节点 → 右子树,这段递归代码完美贴合这个规则,我们一步步看它的执行流程:
- 每次调用
printInorder时,首先检查传入的节点是否为空。如果不为空,先一头扎进左子树的递归遍历——这会一直递归下去,直到找到树最左侧的“尽头”(也就是某个叶子节点的左孩子,值为null)。 - 当左子树的遍历彻底完成(遇到null返回后),才会执行
System.out.print(node.key + " "),也就是打印当前节点的值。 - 打印完当前节点后,再递归遍历它的右子树,同样遵循“左→根→右”的顺序处理右子树的所有节点。
举个直观的例子,比如我们有这样一棵二叉树:
1 \ 2 / 3
它的遍历过程是:
- 调用
printInorder(1),节点不为空,先执行printInorder(1.left)(也就是null),触发return回到printInorder(1)。 - 打印
1。 - 调用
printInorder(1.right)(节点2)。 - 在
printInorder(2)中,先执行printInorder(2.left)(节点3)。 - 在
printInorder(3)中,执行printInorder(3.left)(null),return后打印3。 - 执行
printInorder(3.right)(null),return回到printInorder(3),函数执行完毕回到printInorder(2)。 - 打印
2。 - 执行
printInorder(2.right)(null),return回到printInorder(2),函数执行完毕回到最初的调用,遍历结束。最终输出是1 3 2。
二、空return的作用分步说明
这个if (node == null) return;是递归代码的灵魂,它的作用可以拆成三点:
- 终止递归的边界:当传入的节点是null时,说明已经走到了树的“末梢”,没有可遍历的节点了,这时候用return直接结束当前函数调用,避免继续执行后面的递归逻辑,防止出现空指针异常(比如去访问
null.left)。 - 触发回溯的关键:每次遇到null返回后,程序会回到上一层的递归调用中,继续执行后续代码。比如刚才例子中,
printInorder(3.left)返回后,才会执行打印3的key,这就是回溯的过程——从树的末梢回到上层节点,完成节点的处理。 - 避免无效操作:如果没有这个return,当node为null时,程序会继续执行
printInorder(node.left),这时候因为null没有left属性,会直接抛出NullPointerException,导致程序崩溃。所以这个return是保护程序正常运行的必要条件。
三、执行printInorder(node.right)且传入的参数为null时,控制权转移到哪里?
首先要明确:只有当当前node不为null时,才会执行printInorder(node.right)——如果node.right是null,那么调用的就是printInorder(null),这时候会触发return,程序的控制权会回到调用这个printInorder(null)的上层函数调用的下一行代码。
还是用刚才的例子来说:在printInorder(3)中,执行完printInorder(3.right)(也就是null,进入printInorder(null)执行return后),控制权会回到printInorder(3)中printInorder(3.right)的下一行——也就是printInorder(3)的函数末尾,此时printInorder(3)执行完毕,会回到调用它的printInorder(2)中printInorder(2.left)的下一行,也就是执行打印2的key的代码。
简单总结:当printInorder(null)执行return后,程序会回到发起这个null调用的那行代码的下一行,继续执行上层递归的剩余逻辑。
内容的提问来源于stack exchange,提问作者Rahul Kashyap Rajput
相关产品推荐
相关产品推荐

