代码随想录二刷 |二叉树 |101. 对称二叉树

代码随想录二刷 |二叉树 |101. 对称二叉树

  • 题目描述
  • 解题思路 & 代码实现
    • 递归法
    • 迭代法
      • 使用队列
      • 使用栈

题目描述

101.对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:
在这里插入图片描述
输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:
在这里插入图片描述
输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [1, 1000] 内
  • -100 <= Node.val <= 100

进阶:你可以运用递归和迭代两种方法解决这个问题吗?

解题思路 & 代码实现

比较的是根节点的两颗子树是否对称,也就是说,左子树外侧的节点与右子树外侧的节点相等,同时,左子树内侧的节点与右子树内侧的节点相等。

因为我们要判断各个子节点是否相等,而这需要利用递归的返回值来判断,所以只能用后序遍历,准确来说,一个树要进行左右中,另一个树要进行右左中,这样才能同步进行判断。

递归法

递归三部曲:

  1. 确定递归函数的参数和返回值
    因为要利用返回值来比较左右两个子树的节点是否相等,所以参数为左子树节点和右子树节点,返回值为bool
    bool compare(TreeNode* left, TreeNode* right)
    
  2. 确定终止条件

当节点为空时,有如下几种情况:

- 左节点为空,右节点不为空。不对称,return false
- 左节点为空,右节点也为空。对称,return true
- 左节点不为空,右节点为空。不对称,return false

当节点不为空时:

- 左右都不为空,判断左右节点是否相同,不相同就return false,反之return true
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 true;

这里没有使用else,而是else if, 因为我们把以上情况都排除之后,剩下的就是 左右节点都不为空,且数值相同的情况。

  1. 确定递归的逻辑
    单程递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。
  • 比较二叉树外侧是否对称,传入的是左节点的左孩子,右节点的右孩子
  • 比较二叉树内侧是否对称,传入的是左节点的右孩子,右节点的左孩子
  • 左右都对称就返回true,有一侧不对称就返回false
bool outside = compare(left->left, right->right);
bool inside = compare(left->right, right->left);
bool isSam = outSide && inSide;
return isSam;

整体代码如下:

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 true;bool outside = compare(left->left, right->right);bool inside = compare(left->right, right->left);bool isSam = outSide && inSide;return isSam;}bool isSymmetric(TreeNode* root) {if (root == NULL) return true;return compare(root->left, root->right);}
};

迭代法

使用队列

这里的迭代法可不是前中后序的迭代写法,因为本题的本质是判断两个树是否是相互翻转的,其实已经不是所谓二叉树遍历的前中后序的关系了。

这里我们可以使用队列来比较两个树(根节点的左右子树)是否相互翻转,(注意这不是层序遍历)

在遍历时把左右两个子树要比较的元素顺序放进一个容器,然后成对成对的取出来进行比较

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 || (leftNode->val != rightNode->val))) {return false;}que.push(leftNode->left);que.push(rightNode->right);que.push(leftNode->right);que.push(rightNode->left);}return true;}
};

使用栈

class Solution {
public:bool isSymmetric(TreeNode* root) {if (root == NULL) return true;stack<TreeNode*> st;st.push(root->left);st.push(root->right);while (!st.empty()) {TreeNode* leftNode = st.top();st.pop();TreeMode* rightNode = st.top()'st.pop();if ((!leftNode || !rightNode || (leftNode->val != rightNode->val))) {return false;}st.push(leftNode->left);st.push(rightNode->right);st.push(leftNode->right);st.push(rightNode->left);}return true;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/264622.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐4个优秀的 Python 时间序列分析库

时间序列分析在金融和医疗保健等领域至关重要&#xff0c;在这些领域&#xff0c;理解随时间变化的数据模式至关重要。在本文中&#xff0c;我们将介绍四个主要的Python库——statmodels、tslearn、tssearch和tsfresh——每个库都针对时间序列分析的不同方面进行了定制。这些库…

调度算法1

一、 先来先服务FCFS&#xff08;First Come First Serve) 先来先服务"&#xff08;First Come, First Served&#xff0c;简称FCFS&#xff09;是一种调度算法&#xff0c;常用于处理队列中的任务或进程。它的基本原则是按照任务或进程到达的顺序进行处理&#xff0c;即先…

基于SSM的医院交互系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

AWR1642 boost开发板支持的TI参考设计

打开radar_toolbox_1_30_00_05\source\ti\examples\examples_overview,通过输入“1642”查找AWR1642 BOOST支持的参考设计,通过筛选,支持AWR1642 BOOST的参考设计如下: 挑选出两个参考设计上手,一个是“nonos_oob_16xx",不带OS;另一个是”short range radar“,比较…

ConcurrentModificationException日志关键字报警引发的思考

本文将记录和分析日志中的ConcurrentModificationException关键字报警&#xff0c;还有一些我的思考&#xff0c;希望对大家有帮助。 一、背景 近期&#xff0c;在日常的日志关键字报警分析时&#xff0c;发现我负责的一个电商核心系统在某时段存在较多ConcurrentModificatio…

AttributeError: module ‘lib‘ has no attribute ‘X509_V_FLAG_CB_ISSUER_CHECK‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

C# WPF上位机开发(通讯协议的编写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 作为上位机&#xff0c;它很重要的一个部分就是需要和外面的设备进行数据沟通的。很多时候&#xff0c;也就是在这个沟通的过程当中&#xff0c;上…

使用python绘制现有彩票记录走势图

在数据分析和可视化的领域中&#xff0c;彩票走势图是一个经典的例子&#xff0c;它可以展示彩票数字随时间的出现频率和趋势。这里使用英国使用EuroMillions彩票的历史数据作为示例&#xff0c;使用Python和Matplotlib库来创建一个简单的走势图。可以在以下网站搜索.csv文件。…

dell r720远程网络安装ubuntu20.04(无U盘)

登陆后界面&#xff0c;在主界面上&#xff0c;我们就可以看到各个硬件组件的状态。在快速启动任务栏中&#xff0c;可以对系统电源进行操作&#xff0c;如开机、关机等。安装操作系统&#xff0c;在虚拟控制台预览处点击>启动 按照浏览器出现的提示确定安装控件等&#x…

实现加盐加密方法以及java nio中基于MappedByteBuffer操作大文件

自己实现 传统MD5可通过彩虹表暴力破解&#xff0c; 加盐加密算法是一种常用的密码保护方法&#xff0c;它将一个随机字符串&#xff08;盐&#xff09;添加到原始密码中&#xff0c;然后再进行加密处理。 1. 每次调用方法产生一个唯一盐值&#xff08;UUID &#xff09;密码…

uc_16_UDP协议_HTTP协议

1 UDP协议 适合游戏、视频等情景&#xff0c;安全性要求不高&#xff0c;效率要求高。 1&#xff09;UDP不提供客户机与服务器的链接&#xff1a; UDP的客户机与服务器不必存在长期关系。一个UDP的客户机在通过一个套接字向一个UDP服务器发送了一个数据报之后&#xff0c;马上…

VOL-vue 框架 文件上传控件关于大文件上传等待的修改

我的项目在测试voltable列表组件中对阿里云OSS做附件上传时&#xff0c;几十M的文件可能就会需要一段时间来上传&#xff0c;才能有OSS的状态和链接返回。 但是控件VolUpload.vue并没有去在这方面做任何交互体验上的控制&#xff0c;而且VolUpload.vue本身写的几个上传函数都是…