LeetCode对称二叉树C语言代码部分测试用例运行异常求助
对称二叉树代码问题排查
你写的代码在root = [1,2,2]用例下运行不符合预期,核心问题有三个:
- 静态全局变量未重置
你定义的n、left、right都是static修饰的静态全局变量,生命周期贯穿整个程序运行全程,不会随函数调用自动归零。在线判题平台会连续执行多个测试用例,上一个用例修改的变量值会残留到当前用例。比如你先跑[1,2,2,3,4,4,3]用例,执行完后三个变量值都是3,再跑[1,2,2]用例时计数从3开始累加,最终判断条件n == left必然不成立,直接返回错误结果。 - 边界场景判断缺失
isSymmetric函数只处理了根节点左右子节点全为空的场景,没有覆盖「单侧子节点为空、另一侧非空」的不对称情况,遇到这类用例会直接访问空指针触发运行错误;symcenter递归函数的终止逻辑也有缺陷,遇到一个节点为空、另一个非空的不对称场景时直接返回,没有标记该状态为不对称,很容易把结构不匹配的树误判为对称。 - 计数判断逻辑本身不可靠
你通过统计子树节点数、遍历匹配计数的方式判断对称,本质绕开了结构校验:只要两个子树节点总数相同、遍历到的同值节点数和子树节点数一致就返回真,无法识别「值相同但节点位置不匹配」的不对称场景,存在逻辑漏判。
修正方案
不需要额外写节点计数函数,直接用递归交叉校验对称位置的节点即可,判断逻辑非常直接:
- 两个对称位置节点同时为空,属于对称
- 两个节点一个为空、一个非空,属于不对称
- 两个节点值不相等,属于不对称
- 递归校验「左节点的左孩子 和 右节点的右孩子」、「左节点的右孩子 和 右节点的左孩子」两组对称位置,两组都对称才判定为对称
修正后的可运行代码如下:
bool check(struct TreeNode* node1, struct TreeNode* node2){ // 两节点全空,对称 if(node1 == NULL && node2 == NULL) { return true; } // 一空一非空,不对称 if(node1 == NULL || node2 == NULL) { return false; } // 当前值相等,且交叉子节点全对称才返回真 return (node1->val == node2->val) && check(node1->left, node2->right) && check(node1->right, node2->left); } bool isSymmetric(struct TreeNode* root){ // 空树直接判定对称,非空则校验左右子树 return root == NULL ? true : check(root->left, root->right); }
内容的提问来源于stack exchange,提问作者Sofi
相关产品推荐
相关产品推荐

