判断二叉树是否对称需递归或迭代检查左右子树是否镜像相等:即左子树左孩子与右子树右孩子、左子树右孩子与右子树左孩子分别相等且值相同;常见错误是误判子树各自对称或忽略空指针和节点值校验。
判断二叉树是否对称,本质是检查左子树是否与右子树“镜像相等”:即左子树的左孩子等于右子树的右孩子,左子树的右孩子等于右子树的左孩子。不能只比结构,必须同步比较节点值。
关键点在于设计一个辅助函数 isMirror(TreeNode* left, TreeNode* right),它接收两个子树根节点,返回它们是否互为镜像:
return true)return false)return false)left->left 与 right->right,以及 left->right 与 right->left
bool isSymmetric(TreeNode* root) {
if (!root) return true;
return isM
irror(root->left, root->right);
}
bool isMirror(TreeNode left, TreeNode right) {
if (!left && !right) return true;
if (!left || !right) return false;
if (left->val != right->val) return false;
return isMirror(left->left, right->right) &&
isMirror(left->right, right->left);
}
递归直观但有栈溢出风险;迭代更可控,核心是把“待比较的节点对”压入栈中,每次弹出一对做值比较,再把下一层的镜像组合推入栈。
初始压入 root->left 和 root->right;每次取两个节点 l 和 r:
false
false
l->left 与 r->right、l->right 与 r->left 成对压栈bool isSymmetric(TreeNode* root) {
if (!root) return true;
stack stk;
stk.push(root->left);
stk.push(root->right);
while (!stk.empty()) {
TreeNode* r = stk.top(); stk.pop();
TreeNode* l = stk.top(); stk.pop();
if (!l && !r) continue;
if (!l || !r) return false;
if (l->val != r->val) return false;
stk.push(l->left); stk.push(r->right);
stk.push(l->right); stk.push(r->left);
}
return true;
} 新手常写成:isSymmetric(root->left) && isSymmetric(root->right) —— 这是在检查“左子树自身对称”且“右子树自身对称”,完全偏离题意。对称性是跨左右子树的镜像关系,不是子树内部性质。
另一个典型错误是只比结构忽略值:比如用 nullptr 占位但没校验 val,导致 [1,2,2,null,3,null,3] 被误判为对称(实际不是,因为两个 3 不在镜像位置)。
测试时务必覆盖这些用例:
[1,2,2,3,4,4,3] → true[1,2,2,null,3,null,3] → false(注意 null 的位置)[1] → true[] → true递归和迭代都是 O(n) 时间复杂度,每个节点访问一次。但空间表现不同:
O(n)(退化为链表),平均 O(h)(h 为树高)O(w) 个节点(w 为最大宽度),对于满二叉树,宽度远小于深度,此时迭代更省内存如果题目明确要求“避免递归”或输入可能极深,优先选迭代;否则递归更易写对、不易漏边界。
真正容易被忽略的是空指针解引用——无论递归还是迭代,必须在取 ->val 或访问子指针前,先判断指针非空。漏掉这一层检查,本地能过但线上 runtime error 是高频翻车点。
# node
# 栈
# c++
# NULL
# Error
# 递归
# 指针
# 空指针
# 算法
# 子树
# 镜像
# 迭代
# 为空
# 都不
# 二叉树
# 不对称
# 的是
# 只比
相关文章:
开源网站制作软件,开源网站什么意思?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
公众号网站制作网页,微信公众号怎么制作?
制作农业网站的软件,比较好的农业网站推荐一下?
高防服务器如何保障网站安全无虞?
如何自定义建站之星模板颜色并下载新样式?
小建面朝正北,A点实际方位是否存在偏差?
Swift开发中switch语句值绑定模式
如何访问已购建站主机并解决登录问题?
网站微信制作软件,如何制作微信链接?
C#怎么使用委托和事件 C# delegate与event编程方法
如何在阿里云通过域名搭建网站?
如何通过智能用户系统一键生成高效建站方案?
如何在万网开始建站?分步指南解析
如何制作网站标识牌,动态网站如何制作(教程)?
郑州企业网站制作公司,郑州招聘网站有哪些?
建站主机如何选?性能与价格怎样平衡?
已有域名和空间如何快速搭建网站?
建站之星安装后界面空白如何解决?
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
非常酷的网站设计制作软件,酷培ai教育官方网站?
高性价比服务器租赁——企业级配置与24小时运维服务
定制建站哪家更专业可靠?推荐榜单揭晓
贸易公司网站制作流程,出口贸易网站设计怎么做?
广德云建站网站建设方案与建站流程优化指南
如何通过wdcp面板快速创建网站?
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
c# await 一个已经完成的Task会发生什么
如何在Golang中引入测试模块_Golang测试包导入与使用实践
如何在阿里云虚拟服务器快速搭建网站?
如何将凡科建站内容保存为本地文件?
如何在西部数码注册域名并快速搭建网站?
广平建站公司哪家专业可靠?如何选择?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
如何彻底删除建站之星生成的Banner?
如何通过VPS建站无需域名直接访问?
建站之星安装模板失败:服务器环境不兼容?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
Swift中switch语句区间和元组模式匹配
PHP 500报错的快速解决方法
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
海南网站制作公司有哪些,海口网是哪家的?
如何用IIS7快速搭建并优化网站站点?
Android滚轮选择时间控件使用详解
如何用花生壳三步快速搭建专属网站?
建站之星展会模板:智能建站与自助搭建高效解决方案
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
*请认真填写需求信息,我们会在24小时内与您取得联系。