二叉树中基于节点值判断堂兄弟节点的代码修复请求
修复二叉树节点层级与父节点判断的问题
先看你代码里的几个明显问题,这是导致功能失效的核心:
原代码的错误点
- 递归调用
level函数时,第二个参数错误地传了tree->value,而不是要查找的目标值val——这会让递归一直在遍历当前节点的值,根本没在找你要的节点。 - 最后一行的
le...明显是拼写截断,应该是lev+1。 - 只获取层级不够,我们还需要记录每个节点的父节点值,才能判断两个节点的父节点是否不同。
修复后的完整实现思路
我们需要两个辅助函数:
- 一个函数用来获取目标节点的层级,同时处理节点不存在的情况。
- 另一个函数用来获取目标节点的父节点值,同样处理节点不存在的情况。
- 最后主函数判断:两个节点都存在、层级相同、父节点不同这三个条件同时满足,才返回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
相关产品推荐
相关产品推荐

