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
相关产品推荐
相关产品推荐

