Java递归方法验证B树是否为二叉树的问题求助
问题分析与解决
你的代码总是返回false,核心问题出在判断逻辑过于严苛,以及未处理叶子节点和子节点数量为1的情况:
- 二叉树允许节点拥有0、1或2个子节点,而你强制要求每个节点的子节点数量必须是2,直接排除了合法的叶子节点(0个子节点)和只有单侧子节点的情况。
- 遇到叶子节点时,你的代码会尝试访问
children[0]和children[1],要么引发数组越界(叶子节点children数组长度为0),要么递归到空节点触发异常。
修正方案(基于children数组长度等于实际子节点数的情况)
假设你的BNode中,children数组的长度等于节点实际拥有的子节点数量(比如叶子节点的children是长度为0的数组,有1个子节点则数组长度为1),修正后的代码如下:
public boolean isBinary() { // 空树也属于二叉树 return root == null || isBinary(root); } private boolean isBinary(BNode node) { // 子节点数量超过2,直接不符合二叉树要求 if (node.children.length > 2) { return false; } // 叶子节点(无任何子节点),符合条件 if (node.children.length == 0) { return true; } // 检查第一个子节点 boolean leftValid = isBinary(node.children[0]); // 只有1个子节点,只需检查该子节点 if (node.children.length == 1) { return leftValid; } // 有2个子节点,需同时检查两个子节点 boolean rightValid = isBinary(node.children[1]); return leftValid && rightValid; }
特殊情况处理(若BNode的children是固定长度数组,空节点用null填充)
如果你的BNode中,children是固定长度的数组(比如固定长度为2),空的子节点用null表示,那么需要统计实际非空的子节点数量,代码调整为:
public boolean isBinary() { return root == null || isBinary(root); } private boolean isBinary(BNode node) { int validChildCount = 0; // 统计非空的子节点数量 for (BNode child : node.children) { if (child != null) { validChildCount++; } } // 子节点数量超过2,不符合要求 if (validChildCount > 2) { return false; } // 递归检查每个非空的子节点 for (BNode child : node.children) { if (child != null && !isBinary(child)) { return false; } } return true; }
内容的提问来源于stack exchange,提问作者grecode97
相关产品推荐
相关产品推荐

