如何使用递归判断二叉树是否平衡?现有递归实现出错如何修正?
平衡二叉树判定代码错误分析与修复
原代码核心错误
- 返回值类型混乱:递归函数前两个分支返回的是数值类型的高度,后续判断分支返回的是布尔值,递归调用时
Math.min/Math.max会把布尔值隐式转换为0/1参与计算,结果完全不符合预期 - 平衡二叉树定义理解错误:平衡二叉树要求所有节点的左右子树高度差绝对值≤1,而非整棵树的最大高度减最小高度≤1,你的逻辑无法检测子树内部的不平衡情况
- 边界条件高度计算错误:空节点高度通常统一定义为0或-1,叶子节点(无左右子节点)的高度对应应为1或0,你这里叶子节点返回0的计算逻辑本身也不统一
测试用例验证:三层左斜树(根→左孩子→左孙子,无右节点)属于典型的不平衡树,原代码运行后会返回true,进一步验证了上述问题的存在。
正确实现方案
这里给出自底向上的高效实现,时间复杂度O(n),避免重复计算高度:
function isBalanced(rootNode) { // 辅助函数:返回子树高度,若子树不平衡直接返回-1作为标记 function getHeight(node) { if (!node) return 0; // 空节点高度统一定义为0 const leftHeight = getHeight(node.left); // 左子树已不平衡,无需继续计算直接返回标记 if (leftHeight === -1) return -1; const rightHeight = getHeight(node.right); // 右子树已不平衡,无需继续计算直接返回标记 if (rightHeight === -1) return -1; // 当前节点左右子树高度差超过1,标记为不平衡 if (Math.abs(leftHeight - rightHeight) > 1) { return -1; } // 返回当前子树的实际高度 return Math.max(leftHeight, rightHeight) + 1; } // 结果不等于-1则代表整棵树为平衡二叉树 return getHeight(rootNode) !== -1; }
内容的提问来源于stack exchange,提问作者caseyle
相关产品推荐
相关产品推荐

