算法练习第16天|101. 对称二叉树

 101. 对称二叉树

力扣链接icon-default.png?t=N7T8https://leetcode.cn/problems/symmetric-tree/description/

题目描述:

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

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

思路分析:

对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,而不是比较左右子节点。所以在递归遍历的过程中,要同时遍历两棵子树。要比较子树的外侧与内侧。

递归实现 

如果使用递归函数,则递归函数的参数应该是左右子树的根节点指针。同时,判断是否对称需要有bool类型的结果,所以,递归函数的返回值类型可以用bool。其形式如下:

bool compare(TreeNode * left, TreeNode * right){}

如此就完成了递归三部曲中的第一步:确定递归函数的参数和返回值 

因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个左子树的遍历顺序是左右中,一个右子树的遍历顺序是右左中。 

递归第二步:确认终止条件

首先需要对传入的两个子树根节点进行分析,一共有一下五种情况:

1.左子树空、右子树非空

2.左子树非空、右子树空

3.左子树空、右子树空

4.左子树非空、右子树非空,对应元素不相等

5.左子树非空、右子树非空,对应元素相等,需要继续判断

//存在右子树,不存在左子树  ---》不对称
if(left == nullptr && right != nullptr) return false;
//存在左子树,不存在右子树  ---》不对称
else if(left != nullptr && right == nullptr) return false;
//左右子树均不存在  ---》对称
else if(left == nullptr && right == nullptr) return true;
//左右子树均存在,但是对应子树根节点元素不相等   --》不对称
else if(left->val != right->val)  return false;

上述代码是前四种情况,属于递归终止条件。

第五种情况就是需要继续遍历判断的,所以它属于递归第三步:确认单层递归逻辑

 递归第三步:确认单层递归逻辑

继续遍历比较时,应该将左子树的左子树同右子树的右子树进行比较,因为这些都属于外侧。同时,还要将左子树的右同右子树的左进行比较,这些属于内侧。所以单层递归的逻辑如下:

//以上情况都不满足,则只剩下左右子树均存在,且子树根节点元素相等的情况。那么需要继续比较
bool outside = compare(left->left, right->right);  //比较外侧,左子树的左与右子树的右比较
bool inside = compare(left->right, right->left);   //比较内侧,左子树的右与右子树的左比较
if(outside && inside)  //外侧内侧都相等return true;
else   //否则return 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 == nullptr && right != nullptr) return false;//存在左子树,不存在右子树  ---》不对称else if(left != nullptr && right == nullptr) return false;//左右子树均不存在  ---》对称else if(left == nullptr && right == nullptr) return true;//左右子树均存在,但是对应子树根节点元素不相等   --》不对称else if(left->val != right->val)  return false;//以上情况都不满足,则只剩下左右子树均存在,且子树根节点元素相等的情况。那么需要继续比较bool outside = compare(left->left, right->right);  //比较外侧,左子树的左与右子树的右比较bool inside = compare(left->right, right->left);   //比较内侧,左子树的右与右子树的左比较if(outside && inside)  //外侧内侧都相等return true;else   //否则return false;}bool isSymmetric(TreeNode* root) {if(root==nullptr) 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) {  // 左节点为空、右节点为空,此时说明是对称的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;}
};

使用栈实现:

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();TreeNode* rightNode = st.top(); st.pop();if (!leftNode && !rightNode) {continue;}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.mzph.cn/news/811705.shtml

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

相关文章

详解QActionGroup类的使用

QActionGroup 是 Qt 框架中用于管理一组相关 QAction 对象的类。它主要用于实现互斥选择&#xff08;即单选&#xff09;或多选&#xff08;即复选&#xff09;的行为&#xff0c;特别是在菜单、工具栏或上下文菜单中&#xff0c;当存在一系列相互排斥或相关联的操作选项时&…

【Python面试题收录】什么是堆?什么是栈?栈和堆的区别是什么?

一、堆和栈的定义 &#xff08;1&#xff09;堆&#xff08;Heap&#xff09; 数据结构&#xff1a;堆是一种特殊的完全二叉树&#xff0c;满足父节点的值总是大于或等于&#xff08;大根堆&#xff09;其子节点的值。也可以是总是小于或等于&#xff08;小根堆&#xff09;其…

品牌百度百科词条创建多少钱?

百度百科作为国内最具权威和影响力的知识型平台&#xff0c;吸引了无数品牌和企业争相入驻。一个品牌的百度百科词条&#xff0c;不仅是对品牌形象的一种提升&#xff0c;更是增加品牌曝光度、提高品牌知名度的重要途径。品牌百度百科词条创建多少钱&#xff0c;这成为了许多企…

玻璃生产线 Web 组态应用案例介绍

玻璃生产线组态可视化 概述 随着工厂信息化、数字化发展&#xff0c;智慧生产车间成为必然发展趋势&#xff0c;通过智能硬件、物联网、大数据等智慧化技术与手段&#xff0c;提高车间生产设备、工艺设备的智能执行能力&#xff0c;从而提升整个车间乃至工厂的智能化、网络化与…

【SpringBoot XSS存储漏洞 拦截器】Java纯后端对于前台输入值的拦截校验实现 一个类加一个注解结束

先看效果&#xff1a; 1.js注入拦截&#xff1a; 2.sql注入拦截 生效只需要两步&#xff1a; 1.创建Filter类&#xff0c;粘贴如下代码&#xff1a; package cn.你的包命.filter; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IO…

macos 查看 远程服务器是否开放某个端口

想要使用mac查看远程服务器某个端口是否开发&#xff0c;可通过 nc 命令&#xff0c;如下&#xff1a; nc -zv <服务器IP> <端口号>如果该端口开发&#xff0c;结果为&#xff1a;succeeded! Connection to <服务器IP> port <端口号> [类型] succeed…

CLion 2024:为Mac与Win打造的卓越跨平台集成开发环境

CLion 2024作为一款跨平台IDE&#xff0c;CLion 2024不仅完美支持Mac和Windows两大操作系统&#xff0c;更在细节之处展现了其出色的跨平台兼容性。无论你是在Mac的优雅界面下工作&#xff0c;还是在Windows的实用环境中编程&#xff0c;CLion 2024都能为你提供一致且流畅的开发…

Day98:云上攻防-云原生篇K8s安全Config泄漏Etcd存储Dashboard鉴权Proxy暴露

目录 云原生-K8s安全-etcd(Master-数据库)未授权访问 etcdV2版本利用 etcdV3版本利用 云原生-K8s安全-Dashboard(Master-web面板)未授权访问 云原生-K8s安全-Configfile鉴权文件泄漏 云原生-K8s安全-Kubectl Proxy不安全配置 知识点&#xff1a; 1、云原生-K8s安全-etcd未…

对SQL主键优化策略收录

1. 主键选择 类型选择&#xff1a;主键应当尽可能短小且高效。通常推荐使用整数类型&#xff08;如INT或更小的SMALLINT、TINYINT&#xff09;&#xff0c;尤其是带有自增属性&#xff08;AUTO_INCREMENT&#xff09;的整数&#xff0c;这样既能保证唯一性&#xff0c;又能减少…

Springboot实现链路追踪功能

前言 在日常开发中&#xff0c;一个业务的实现往往会调用很多个方法&#xff0c;当我们去看日志的时候&#xff0c;各种接口的日志打印出来&#xff0c;看着就头疼&#xff0c;压根没办法去定位&#xff0c;而链路追踪就能很好的帮助我们去查看接口从头至尾依次调用了哪些方法…

vue小程序跳转页面携带参数

跳转携带对象 前一个页面&#xff1a;跳转的方法里把数组转成字符串 gotoArea(item){console.log("item",item)let datas JSON.stringify(item);goto.goto(navigateTo,index/area/main?itemdatas);},跳转的目标页面&#xff1a; onLoad(options){let datas JSO…

MacOS13搭建安卓逆向环境

MacOS中用apktool解包 这里是所有链接&#xff1a;123云盘下载 https://www.123pan.com/s/9QRqVv-JE7Y.html安装apktool https://apktool.org/docs/install/ 或者下载单独的jar包 brew install wgethttps://apktool.org/blog/apktool-2.9.3下载直链&#xff1a;https://co…

ChatGPT让论文写作更高效,让学术研究更精彩

ChatGPT无限次数:点击直达 ChatGPT让论文写作更高效&#xff0c;让学术研究更精彩 引言 在当今数字化时代&#xff0c;人工智能技术的发展为学术研究者提供了更多创新的机会和工具。其中&#xff0c;自然语言处理模型如ChatGPT在论文写作领域展现出强大的潜力。本文将介绍如何…

数据仓库—大数据建模

大数据建模是一个关键的环节&#xff0c;它直接影响到数据仓库的设计和运行效果。下面将详细介绍一下大数据建模的一般步骤和关键概念。 建模步骤 需求分析&#xff1a;首先要对业务需求进行深入分析&#xff0c;了解业务的核心目标和数据分析的重点。只有明确了需求&#xff…

spring的事件推送

本质上是设计模式中的观察者模式。 一、什么是观察者模式 观察者模式是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;其所有依赖者都会收到通知并自动更新。 二、什么是spring的事件推送 在 Spring 的事…

使用Python批量将PDF转Word

简述 以下全部代码无法完美对图片、表格等非文字形式的内容转化。要较好的效果需要使用光学字符分析等方法进行转化 我懒&#xff0c;不想将代码模块拆分出来写注释 除代码1中有详细注释外&#xff0c;剩下的代码仅在关键部分进行注释 代码1&#xff1a;小规模文件的转换 代码…

TikTok如何矩阵养号?TK防关联引流系统助力TK账号安全运营

TK是 TikTok旗下的短视频社交媒体&#xff0c;平台目前是全球最火的短视频平台&#xff0c;目前全球活跃用户已经超过8亿。其中 TikTok的用户已经达到8亿。TK这款短视频社交媒体平台在海外的发展潜力非常大&#xff0c;也是国内很多人的创业目标&#xff0c;很多人都想从 TK这个…

如何将arping以及所有依赖打包安装到另外一台离线ubuntu机器

ubuntu系统下可以使用arping命令检测局域网内一些ip是否冲突&#xff0c;使用方式为&#xff1a; arping xx.xx.xx.xx 在线情况下&#xff0c;可以使用下面命令下载arping&#xff0c;然后使用即可 apt install arping 但是有些情况下机器可能不能上网&#xff0c;这时就需要将…

文件上传阿里云OSS准备工作及入门程序(保姆级手把手教你)

使用阿里云作为第三方&#xff0c;来存储文件。 登录阿里云官网&#xff0c;开通对象存储OSS 这样就开通成功了。点击 管理控制台 &#xff0c;出现下面页面。 不过我们也可以不充值购买&#xff0c;先叉掉&#xff0c;它有30天试用的。 创建Bucket 点这个创建Bucket。 创建存…

[论文笔记] Pai-megatron Qwen1.5-14B-CT 后预训练 踩坑记录

1. 模型权重转换报错 hf2mcore_1.5_v2.py 报错为: /mnt/cpfs/kexin/dlc_code/qwen1.5/PAI-Megatron-Patch/toolkits/model_checkpoints_convertor/qwen/hf2mcore_1.5_v2.py 正确文件替换如下,更改了477行,删除了 args.hidden_size 这个维度,在tp>1时也支持转换: eli…