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

C语言完美二叉树检测函数出错排查

问题分析与修复

你的函数始终返回0的核心原因是深度计算逻辑与校验条件不匹配,具体问题如下:

1. find_depth_left函数的深度计算错误

当前find_depth_left返回的是从根到最左叶子的边数,而非叶子节点所在的层级数或树的高度:

  • 单节点树:因无左孩子直接返回0;
  • 根节点带左右叶子的完美二叉树:返回1(根到左叶子的边数);
  • 三层完美二叉树:返回2(根→左→左叶子的边数)。

这种计算方式和你后续isPerfect中的校验逻辑完全不匹配。

2. isPerfect的叶子节点校验条件错误

在isPerfect中,你用depth == (level +1)判断叶子节点是否符合完美树要求,但结合find_depth_left的返回值:

  • 单节点树:depth=0,level=0,判断0 == 0+1 → 不成立,返回0(但单节点树本身是完美二叉树);
  • 根带左右叶子的完美二叉树:叶子节点level=1,depth=1,判断1 ==1+1 → 不成立,返回0;
    所有符合条件的完美树都会因为这个校验失败返回0。

修复方案

方案一:修正深度计算逻辑

调整find_depth_left,让它返回从根到最左叶子的节点层数(根为0层):

int find_depth_left(const binary_tree_t *tree)
{
    int depth = 0;
    const binary_tree_t *current = tree;
    // 遍历到最左叶子节点
    while (current->left != NULL) {
        depth++;
        current = current->left;
    }
    return depth;
}

同时修改isPerfect中的校验条件,去掉+1:

if (!tree->left && !tree->right)
    return (depth == level);  // 直接比较depth和当前节点的level

方案二:调整深度定义为树的高度(节点数)

如果希望find_depth_left返回树的高度(节点数,单节点树高度为1),可以改写为递归方式:

int find_depth_left(const binary_tree_t *tree)
{
    if (tree == NULL)
        return 0;
    return 1 + find_depth_left(tree->left);
}

此时isPerfect中的校验条件depth == (level +1)可以保留,因为:

  • 单节点树:depth=1,level=0 → 1 ==0+1 成立;
  • 叶子节点level=1,depth=2 → 2 ==1+1 成立。

额外注意点

  • 当输入树只有根节点时,binary_tree_is_perfect应该返回1(完美二叉树定义:所有叶子节点在同一层,且每个非叶子节点都有两个子节点,单节点满足条件);
  • isPerfect函数的参数注释遗漏了@tree,建议补充以提升代码可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:55:24