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

二叉树中基于节点值判断堂兄弟节点的代码修复请求

修复二叉树节点层级与父节点判断的问题

先看你代码里的几个明显问题,这是导致功能失效的核心:

原代码的错误点

  • 递归调用level函数时,第二个参数错误地传了tree->value,而不是要查找的目标值val——这会让递归一直在遍历当前节点的值,根本没在找你要的节点。
  • 最后一行的le...明显是拼写截断,应该是lev+1。
  • 只获取层级不够,我们还需要记录每个节点的父节点值,才能判断两个节点的父节点是否不同。

修复后的完整实现思路

我们需要两个辅助函数:

  1. 一个函数用来获取目标节点的层级,同时处理节点不存在的情况。
  2. 另一个函数用来获取目标节点的父节点值,同样处理节点不存在的情况。
  3. 最后主函数判断:两个节点都存在、层级相同、父节点不同这三个条件同时满足,才返回true。

修复后的代码示例

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

// 假设二叉树节点结构定义如下
typedef struct TreeNode {
    int value;
    struct TreeNode *left;
    struct TreeNode *right;
} Tree;

// 获取目标节点的层级,不存在则返回-1
int getLevel(Tree* tree, int val, int currentLevel) {
    if (tree == NULL) {
        return -1; // 用-1表示节点不存在
    }
    if (tree->value == val) {
        return currentLevel;
    }
    // 先查左子树
    int leftLevel = getLevel(tree->left, val, currentLevel + 1);
    if (leftLevel != -1) {
        return leftLevel;
    }
    // 左子树没找到,查右子树
    return getLevel(tree->right, val, currentLevel + 1);
}

// 获取目标节点的父节点值,不存在或为根节点则返回-1
int getParent(Tree* tree, int val) {
    if (tree == NULL) {
        return -1;
    }
    // 检查当前节点的左右子节点是否是目标
    if ((tree->left != NULL && tree->left->value == val) || 
        (tree->right != NULL && tree->right->value == val)) {
        return tree->value;
    }
    // 先查左子树
    int leftParent = getParent(tree->left, val);
    if (leftParent != -1) {
        return leftParent;
    }
    // 左子树没找到,查右子树
    return getParent(tree->right, val);
}

// 主函数:判断两个节点是否同层级且父节点不同
bool isSameLevelDifferentParent(Tree* root, int val1, int val2) {
    // 先判断两个节点是否都存在
    int level1 = getLevel(root, val1, 0); // 根节点层级设为0,也可以设为1,保持一致即可
    int level2 = getLevel(root, val2, 0);
    if (level1 == -1 || level2 == -1) {
        return false; // 有节点不存在,直接返回false
    }
    // 判断层级是否相同
    if (level1 != level2) {
        return false;
    }
    // 获取两个节点的父节点
    int parent1 = getParent(root, val1);
    int parent2 = getParent(root, val2);
    // 父节点不同(注意根节点没有父节点,题目说明是两个不同节点,所以不会出现两个都是根节点的情况)
    return parent1 != parent2;
}

额外说明

  • 我假设根节点的层级是0,如果你习惯从1开始计数,只需要在调用getLevel时把初始值改成1即可。
  • 要注意边界情况:比如其中一个节点不存在,或者其中一个是根节点(此时父节点为-1,另一个如果不是根节点,父节点肯定不等于-1,符合条件的话会返回true)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:46:48