89、【栈与队列】leetcode ——101. 对称二叉树:先序递归与非递归+层次遍历(C++版本)

news2025/2/24 18:22:41

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
原题链接:101. 对称二叉树

解题思路

一、先序遍历

1、递归

设置两个指针进行遍历对比,分别指向互相对称位置:左子树的左孩子右子树的右孩子互对称,左子树的右孩子右子树的左孩子互对称。

每次遍历前先判定对称位置上是否有结点,是否值相同。
(1)当都为空时,说明遍历到底;
(2)当一个为空,另一个不为空时,说明互不对称;
(3)当双方值不相同时,说明互不对称。

然后,再分别让两个指针后续孩子的对称位置进行遍历:左的左与右的右,左的右与右的左。

/**
 * 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) {
        // 左右都为空时,说明遍历到底,返回true
        if(!left && !right)             return true;            
        // 一个为空,一个不为空,返回false
        if(!left || !right)             return false;
        // 对称结点不相等,返回false。注意:为了防止空指针异常,这里不能和第一行用||共写
        if(left->val != right->val)     return false;
        // 左结点的左孩子与右结点的右孩子为对称位置,此时遍历为中左右
        bool leftcom = compare(left->left, right->right);
        // 左结点的右孩子与右结点的左孩子为对称位置,此时遍历为中右左
        bool rightcom = compare(left->right, right->left);
        return leftcom & rightcom;
    }
    bool isSymmetric(TreeNode* root) {
        if(!root)       return false;
        return compare(root->left, root->right);
    }
};

2、非递归

每次从栈中弹出两个元素进行操作,这两个元素应分别为互对称位置元素。
然后判定是否为对称元素,不为对称元素则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 isSymmetric(TreeNode* root) {
        if(!root)       return false;
        stack<TreeNode*> st;
        st.push(root->left);
        st.push(root->right);
        while(!st.empty()) {
            TreeNode* leftnode = st.top();      st.pop();            
            TreeNode* rightnode = st.top();     st.pop();
            if(!leftnode && !rightnode)         continue;
            if(!leftnode || !rightnode)         return false;
            if(leftnode->val != rightode->val)  return false;
            // 注意加入顺序,左的左与右的右互配,左的右与右的左互配
            st.push(leftnode->left);
            st.push(rightnode->right);
            st.push(leftnode->right);
            st.push(righttnode->left);
        }
        return true;
    }
};

二、层次遍历

注意:此时不用再用while(n--),否则会报错

Line 26: Char 30: runtime error: member access within misaligned address 0xbebebebebebebebe for type ‘TreeNode’, which requires 8 byte alignment (solution.cpp)
0xbebebebebebebebe: note: pointer points here
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:35:30

/**
 * 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 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;
            if(!leftnode || !rightnode)             return false;                
            if(leftnode->val != rightnode->val)     return false;
            que.push(leftnode->left);
            que.push(rightnode->right);
            que.push(leftnode->right);
            que.push(rightnode->left);
        }
        return true;
    }
};

参考文章:101. 对称二叉树

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【源码解析】Springboot整合ElasticSearch客户端的源码解析

Springboot整合ElasticSearch客户端的源码解析 ElasticSearch版本 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>2.2.5.RELEASE</version>&…

[蓝桥杯 2022 国 A] 环境治理(C++,Floyd,二分法)

题目描述 LQ 国拥有 nnn 个城市&#xff0c;从 000 到 n−1n - 1n−1 编号&#xff0c;这 nnn 个城市两两之间都有且仅有一条双向道路连接&#xff0c;这意味着任意两个城市之间都是可达的。每条道路都有一个属性 DDD&#xff0c;表示这条道路的灰尘度。当从一个城市 A 前往另…

linux 中用rancher k8s 部署springboot项目

前期条件: linux--》ECS服务器: rancher集群: 操作流程: 1、制作简单springboot项目使用docker生成镜像项目端口:8080并写一个测试controller

Go 1.19.3 interface原理简析

interface 接口&#xff0c;分为有方法签名的接口和空接口 interface{fn()…} 有方法签名的接口&#xff0c;底层运行时结构 iface iface src/runtime/runtime2.go type iface struct {tab *itab // 接口类型itab, i-table的缩写data unsafe.Pointer // 接口值指针…

互联网应用的架构演变之路

文章目录单体应用架构垂直应用架构分布式架构SOA架构微服务架构SOA架构&微服务架构对比分布式应用开发解决方案随着互联网的发展&#xff0c;网站的应用也不断扩大&#xff0c;从而导致系统架构不断的进行变化&#xff0c;从互联网早起到现在&#xff0c;系统架构大致经历了…

用Python画一只小兔子,祝您新年前途似锦,大展宏图

用Python画一只小兔子&#xff0c;祝您新年前途似锦&#xff0c;大展宏图 兔年到了&#xff0c;祝大家新年前途似锦&#xff01;大展宏图&#xff01; 2021牛年&#xff0c;我用Python画了一头金牛&#xff0c;参考&#xff1a;Python画金牛 2022虎年&#xff0c;我用Python画…

MarkDown语法 + Typora笔记本

目录 一、多级标题 二、有序列表 三、无序列表 四、任务列表 五、行内代码 六、代码块 七、插入表格 八、插入图片 一、多级标题 1、语法 一级标题&#xff1a;# 二级标题&#xff1a;## 三级标题&#xff1a;### 四级标题&#xff1a;#### 五级标题&#xff1a;…

stackoverflow网站左下角弹框点击我接收所有cookie没反应怎么解决?

问题描述&#xff1a;打开stackoverflow网页后左下角总是有一个弹窗&#xff0c;点击接受所有cookie没有反应。 产生原因&#xff1a;因为是外网&#xff0c;因此点击按钮触发的时候被拦截了。 微软自带的edge浏览器&#xff1a; 打开浏览器进入扩展 选择管理扩展 获取Micro…

如何轻松应对IB数学?

如何轻松应对IB数学&#xff1f;同学想要在IB数学科取得好成绩&#xff0c;可以从两个方面来着手。 1.复习技巧 第一个是复习技巧。这方面&#xff0c;同学要清楚知道自己读的课程&#xff0c;它的教学大纲&#xff08;Syllabus&#xff09;要求是什么&#xff0c;还有它背后想…

【Bp2Lua】常量折叠和变量折叠

【Bp2Lua】常量折叠和变量折叠 谈一下编译器折叠优化算法 动机 变量折叠是 bp2lua 早期确定的两个技术卡点之一 bp2lua 做尽可能保守和必要的优化&#xff0c;提升生成代码的可读性&#xff0c;方便在生成代码上进行二次开发 常量折叠 常量折叠 - 维基百科&#xff0c;自…

Stlink固件更新问题“ST-Link is not in the dfu mode Please restart it“的解决方法

安装stlink utility&#xff1a;官网下载&#xff1a;https://www.st.com/content/st_com/zh.html在ST-LINK utility中连接芯片&#xff0c;提示仿真器版本过低&#xff0c;点击更新&#xff0c;报错提示&#xff1a;“ST LINK is not in the DFU mode plesse restart it”操作…

Day 6 Bean 的生命周期

建议浏览顺序从Day 1 开始。1 Bean的声明周期Spring Bean的生命周期是从 Bean 实例化之后&#xff0c;即通过反射创建出对象之后&#xff0c;到Bean成为一个完整对象&#xff0c;最终存储到单例池中&#xff0c;这个过程被称为Spring Bean的生命周期。Spring Bean的生命周期大体…

ArcGIS JS API分页查询小结

如果遇到发布的服务要素非常多&#xff0c;比如点要素&#xff0c;此时如果想要查询相关的属性或几何信息&#xff0c;如果使用featurelayer的query方法&#xff0c;可能会遇到server后台返回数限制&#xff0c;而只能返回获取到返回数上限的要素数目。 一个简单的方法是&…

nginx学习笔记4(小d课堂)

linux服务器安装jdk和jar包上传 我们把我们的文件放到我们的路径下&#xff0c;这部分之前学过了&#xff0c;这里我们再来复习一遍。 然后我们去解压这个压缩包&#xff1a; 然后我们给这个文件改个名字&#xff1a; 然后我们要去配置环境变量&#xff1a; 在文件末尾加 然后我…

新库上线 | CnOpenDataA股上市公司招投标数据

A股上市公司招投标数据 一、数据简介 招投标是指在市场经济条件下进行大宗货物的买卖、工程建设项目的发包与承包以及服务项目的采购与提供时所采取的一种普遍交易方式。招标和投标是一种商品交易行为&#xff0c;是交易过程的两个方面。历经三十多年的发展&#xff0c;我国已…

resultType自动映射与结果映射resultMap

今天继续完善一下mybatis系列相关博客&#xff0c;以便查阅&#xff0c;同时也希望能帮助到有需要的小伙伴&#xff0c;各位看到此博客的小伙伴&#xff0c;如有不对的地方请及时通过私信我或者评论此博客的方式指出&#xff0c;以免误人子弟。多谢&#xff01; 这一篇记录一下…

week 9 吴恩达 迁移学习 多任务学习 端到端学习

文章目录一、错误分析二、快速构建系统然后迭代三、训练和测试的不同数据分布1、不匹配数据的偏差和方差2、解决数据不匹配问题。四、迁移学习 transfer learning五、多任务学习 multi-task learning六、端到端 end-to-end learning一、错误分析 当我们在构建一个系统时&#…

自动驾驶BEV火了,再给它加点脑洞会靠谱吗?

作者 | 洪泽鑫 编辑 | Bruce百度今年Create大会上辅助驾驶板块的内容挺硬核的&#xff0c;不在这个行业内基本听不懂。 正好是研究兴趣所在&#xff0c;结合百度给的资料&#xff0c;试着来中译中一下。 总的来说&#xff0c;百度是弄了一个车路一体的BEV感知方案——叫UniBEV。…

基于FPGA的UDP 通信(二)

引言前文链接&#xff1a;基于FPGA的UDP 通信&#xff08;一&#xff09;本文继续介绍与以太网数据协议相关的内容。以太网帧协议IEEE802.3标准规定了&#xff0c;以太网数据传输的格式&#xff1a;字段解释&#xff1a;字段名称字段长度/&#xff08;字节&#xff09;含义前导…

【MyBatis】第二篇:核心配置文件常用标签

前提 Mbatis的配置文件中的顺序如下&#xff1a; MyBatis核心配置文件中的标签必须安装指定的顺序配置。 (properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?…