当前位置: 首页 > news >正文

【代码随想录day 14】 力扣 101. 对称二叉树

视频讲解:https://www.bilibili.com/video/BV1ue4y1Y7Mf/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0101.%E5%AF%B9%E7%A7%B0%E4%BA%8C%E5%8F%89%E6%A0%91.html#%E6%80%9D%E8%B7%AF
力扣题目:https://leetcode.cn/problems/symmetric-tree/

这道题主要是使用递归的思想,先枚举可能发生的情况

  1. 左空右不空 F
  2. 左不空右空 F
  3. 左空右空 T
  4. 左不等于右 F
    后续则是左右两节点存在且相等,因为是对称二叉树,我们要比较左右节点的外侧,也就是left的left和right的right;在比较内侧是否一直,也就是left的right和right的left。
    要注意的是,这道题只能用后序遍历,即左右中的方法。因为我先要判断子节点是否对称再向父节点返回true or false,再去遍历其他的节点。
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool compare(TreeNode* left, TreeNode* right) {//排除空节点情况//左空右不空if(left==NULL && right!=NULL) return false;//左不空右空else if(left !=NULL && right ==NULL) return false;//左空右空else if(left==NULL && right==NULL) return true;//左不等于右else if(left->val!= right->val) return false;//左等于右,向下递归bool outside = compare(left->left,right->right);bool inside = compare(left->right,right->left);bool result = outside &&inside;return result;}bool isSymmetric(TreeNode* root) {if (root == NULL) return true;return compare(root->left, root->right);}
};

举个例子:

               1/     \2         2/   \     /   \3      4   4     3/ \    /     \   / \5  6   7       7  6  5

运行过程如下:

compare(2, 2)
├── compare(3, 3)
│   ├── compare(5, 5) ✅
│   └── compare(6, 6) ✅
├── compare(4, 4)
│   ├── compare(7, 7) ✅
│   └── compare(NULL, NULL) ✅
└── 所有都为 true → 返回 true

还有一种方法是使用队列一层一层来遍历,判断是否相等:

class Solution {
public:bool isSymmetric(TreeNode* root) {if (root == NULL) return true;queue<TreeNode*> que;que.push(root->left);   // 将左子树头结点加入队列que.push(root->right);  // 将右子树头结点加入队列while (!que.empty()) {  // 接下来就要判断这两个树是否相互翻转TreeNode* leftNode = que.front(); que.pop();TreeNode* rightNode = que.front(); que.pop();if (!leftNode && !rightNode) {  // 左节点为空、右节点为空,此时说明是对称的continue;}// 左右一个节点不为空,或者都不为空但数值不相同,返回falseif ((!leftNode || !rightNode || (leftNode->val != rightNode->val))) {return false;}que.push(leftNode->left);   // 加入左节点左孩子que.push(rightNode->right); // 加入右节点右孩子que.push(leftNode->right);  // 加入左节点右孩子que.push(rightNode->left);  // 加入右节点左孩子}return true;}
};

假设树为这样:

       1/   \2     2/ \   / \3  4  4  3

每一层的遍历如下所示:

1
22
3344

每次弹出前两个元素比较值是否相等,即可判断整个树的对称性。

http://www.dtcms.com/a/320203.html

相关文章:

  • 技法笔记3 | 验证交互式shell连接
  • LocalSqueeze(图片压缩工具) v1.0.4 压缩
  • 美图复现|Science:添加显著性的GO富集分析美图
  • Nuxt 4.0 完全指南:Nitro 引擎升级与 Composable API 深度解析
  • 关于Android studio调试功能使用
  • 如何选择适合中小企业的OA系统?XKOA低成本高定制化方案详解
  • 数据可视化Matplotlib
  • 【AI智能编程】Cursor IDE工具学习
  • P1037 [NOIP 2002 普及组] 产生数
  • vue-plugin-hiprint 打印模版使用
  • 【IQA技术专题】大模型评级IQA:Q-Align
  • 深入理解“进程屏蔽字“(Signal Mask)
  • 利用OpenVINO™ Day0快速部署端侧可用的MiniCPM-V4.0视觉大模型
  • 【代码随想录day 14】 力扣 226.反转二叉树
  • C语言memcpy函数详解:高效内存复制的实用工具
  • uniapp-vue2导航栏全局自动下拉变色
  • 损耗对信号质量的影响
  • OpenAI 开源 GPT-OSS:大型语言模型的开放时代正式来临!
  • HTTP请求头详解:从基础到实战
  • 当函数返回有多个返回值时,需要注意的问题 : Effective Python 第19条
  • C++ vector 扩容时到底发生了什么?
  • 一个程序通过 HTTP 协议调用天气 API,解析 JSON 格式的天气数据,提取关键信息并格式化输出:日期、天气状况、温度范围、风向、湿度等核心气象数据。
  • 1688 商品详情接口开发实战:从平台特性到高可用实现
  • Redis最新安装教程(WindowsLinux)
  • 对基带信号进行调制的原因及通俗理解
  • HR人才测评工具,卡特尔16pf性格测试
  • Numpy科学计算与数据分析:Numpy数学函数入门与实践
  • 我爱发明之Linux下使用Conky在桌面显示Spotify状态及封面字符画
  • 无损音乐下载器!(电脑)绿色免费,无限下载,无损音质
  • 是否将标签页tag信息存储在Redux store中还是仅存储在hook的state中