咨询判断满二叉树的递归方法工作原理及代码问题
解析满二叉树判断方法中的递归逻辑
首先得给你揪出代码里的一个致命问题——你在第三个条件分支里写的 return fullHelper(node); 会触发无限递归,因为你一直在重复调用同一个节点,永远跳不出递归循环。正确的写法应该是 return fullHelper(node.left) && fullHelper(node.right);,接下来我就基于修正后的代码,给你拆解这个递归到底是怎么跑的。
递归的核心思路
满二叉树的定义很明确:每个节点要么是没有子节点的叶子节点,要么同时拥有左右两个子节点。递归的本质就是把“检查整棵子树是否为满二叉树”这个大问题,拆成“检查左子树是否符合要求”+“检查右子树是否符合要求”的小问题,一步步往下拆解直到触达终止条件。
1. 递归的终止条件
递归必须有明确的终止点,不然就会无限循环:
- 当传入的
node == null时:直接返回false,因为空节点没法构成一棵有效的满二叉树(你的代码逻辑里也明确了这一点)。 - 当
node是叶子节点(node.left == null && node.right == null):返回true,因为叶子节点本身就满足满二叉树的要求——它没有子节点,符合定义。
2. 递归的递推过程
当当前节点同时拥有左右子节点时,我们需要验证它的左右子树也都是满二叉树:
- 先递归调用
fullHelper(node.left),检查左子树是否为满二叉树 - 再递归调用
fullHelper(node.right),检查右子树是否为满二叉树 - 只有当左右子树的检查结果都为
true时,当前节点对应的子树才是满二叉树,所以用逻辑与&&来合并两个结果。
3. 直接判定不合法的情况
如果当前节点只有左子节点或者只有右子节点(两个子节点不全),直接返回 false——这完全违反了满二叉树的定义,不用再往下递归了。
举个直观的例子
情况1:合法的满二叉树
1 / \ 2 3 / \ / \ 4 5 6 7
递归执行流程:
- 检查根节点1:有左右子节点,递归检查2和3
- 检查节点2:有左右子节点,递归检查4和5
- 检查节点4:叶子节点,返回
true;节点5:叶子节点,返回true→ 节点2的结果是true && true = true - 检查节点3:有左右子节点,递归检查6和7,都返回
true→ 节点3的结果是true - 根节点1的结果是
true && true = true,所以整棵树是满二叉树。
情况2:不合法的非满二叉树
1 / \ 2 3 / 4
递归执行流程:
- 检查根节点1:有左右子节点,递归检查2和3
- 检查节点2:只有左子节点,没有右子节点 → 直接返回
false - 根节点1的结果是
false && true = false,所以整棵树不是满二叉树。
内容的提问来源于stack exchange,提问作者brennan mcgowan
相关产品推荐
相关产品推荐

