You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

打印二叉搜索树(BST)所有叶子节点:为何需要两个递归终止条件?

为什么需要判断root为空的终止条件?

咱们直接看递归过程中会遇到的场景:假设你有这样一棵二叉树:

A
   /
  B

其中B是叶子节点,A的右子节点是None。

当执行printLeaf(A)时:

  1. 首先处理节点A:A不是空,也不是叶子(因为有左子节点),所以会依次调用printLeaf(A.left)(也就是节点B)和printLeaf(A.right)(也就是None)。
  2. 处理节点B:B不是空,且左右子节点都为空,所以打印值后返回,这部分没问题。
  3. 重点来了:处理printLeaf(None)的时候,如果没有第一行if not root: return的判断,函数会直接执行下一行if not root.left and not root.right——但此时root是None,你试图访问root.left,就会触发AttributeError: 'NoneType' object has no attribute 'left',这就是你遇到的异常。

你之前的误解在于:叶子节点的判断if not root.left and not root.right是针对非空节点的。它只能终止“当前节点是叶子”的递归分支,但无法处理“当前节点本身就是空”的情况——因为空节点根本没有left和right属性,连判断叶子的条件都执行不了,直接就报错了。

第一行的判断正是用来兜底这种场景:当递归传入的节点是空的时候,直接返回,避免后续代码尝试访问空节点的属性。这和叶子节点的判断是互补的,两者负责不同的终止场景:

  • 叶子节点判断:处理非空节点中的叶子情况,打印值后终止递归。
  • 空节点判断:处理空节点的情况,直接终止递归,避免报错。

内容的提问来源于stack exchange,提问作者Jenny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:55:26