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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:12:50