【每日一题】二叉树中的伪回文路径

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:递归(DFS)
    • 方法二:位运算
  • 写在最后

Tag

【递归/DFS】【伪回文】【二叉树】【2023-11-25】


题目来源

1457. 二叉树中的伪回文路径


题目解读

伪回文路径指的是路径中的节点值经过重新排序之后可以形成回文数的路径。现在需要返回二叉树中所有从根节点到叶子节点的路径中伪回文路径的数目。


解题思路

伪回文的判断

首先来看一下伪回文路径的判断,核心是对于路径节点值的是否具有伪回文性,即将这些节点重新排列之后是否可以构成回文数。比如某条路径上的节点值依次为 2 1 1 ,经过重新排列之后可以形成 1 2 1 这样的回文数,这里的定义不是很清楚,请继续看下去,后面你就会发现其实本题中不需要细究是回文数还是回文串。以下暂且使用回文数来对这样的回文形式进行表达。

回文数分为偶数回文和奇数回文,偶数回文指的是回文数中的字符数量是偶数,根据回文的特性(从左往右与从右往左读到的数都是一致的),回文数中每个字符出现的数量都要是偶数。

奇数回文指的是回文数中的字符数量是奇数,根据回文的特性(从左往右与从右往左读到的数都是一致的),回文数中仅有一个字符出现的数量是奇数(放置在回文数的中心位置),其余字符的出现次数都是偶数。

综上,要判断一个路径节点是否是伪回文的,只需要统计节点中字符个数为奇数的数量 cnt,如果 cnt <= 0,那么就是伪回文的,否则不是。

超出空间限制

本题,最先想到的就是深搜,得到所有可能的数字路径,比如示例 1 中的所有路径为 {{2,3,3},{2,3,1},{2,1,1}},然后遍历统计每一个的 vector 中元素的个数,仅有一个或者零个元素个数是奇数,那么这个 vector就是伪回文的。但是,超出空间限制,关于空间限制,有个疑问,
LeetCode空间限制的思考 欢迎讨论。

方法一:递归(DFS)

在深搜的过程中记录这条路径中不同节点出现的次数,在遇到叶子节点时统计:

  • 如果奇数个节点值的个数 cnt <= 1,则该路径是伪回文的;
  • 否则不是。

具体地,使用一个哈希表 mp 来维护出现的节点的数量,设当前节点为 node,更新 ++mp[node->val]

  • 如果当前节点是叶子节点则调用 chek 函数来更新答案 ans
  • 否则,递归计算左、右子树;
  • 注意需要回溯的过程,即更新 --mp[node->val]

实现代码

/*** 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 {
private:int ans = 0;
public:void dfs(TreeNode* root, unordered_map<int, int>& mp){if(!root){return;}++ mp[root->val];if(!root->left && !root->right){// 检查当前的路径是否是 伪回文,并更新答案check(mp);}dfs(root->left, mp);dfs(root->right, mp);-- mp[root->val];}void check(unordered_map<int, int>& mp){int cnt = 0;for(auto [_, freq] : mp){if(freq & 1){++ cnt;}}if (cnt <= 1) {++ ans;}}int pseudoPalindromicPaths (TreeNode* root) {unordered_map<int, int> mp;dfs(root, mp);return ans;}
};

复杂度分析

时间复杂度: O ( C × n ) O(C \times n) O(C×n),其中 C C C 是节点中不同元素的数量, n n n 是二叉树中节点数。二叉树中每个元素都会被访问到,每次访问的叶子节点判断是否为伪回文路径的时间复杂度为 O ( C ) O(C) O(C)

空间复杂度: O ( n ) O(n) O(n),深搜深度最深为 O ( n ) O(n) O(n)

方法二:位运算

我们可以使用二进制数来标记路径中的节点出现的数量,节点最多有 10 种,即从 09,如果某个节点值出现次数为偶数则对应位 1 << (node->val) 记为 0,如果某个节点值出现次数为奇数则对应位 1 << (node->val) 记为 1。我们使用 mask 来表示某条路径中节点出现次数的奇偶数情况,比如 100000011 表示节点值 019 出现次数均为奇数。当前节点 nodemask 更新为 mask ^= 1 << node->val

如果 mask 中只有一个 1 或者没有 1,那么去掉 1 之后,mask 就变成 0 了,那么判断

KaTeX parse error: Expected 'EOF', got '&' at position 6: mask&̲(mask−1)=0

是否成立,如果成立则说明 mask 中要么只有一个 1,要么全为 0

实现代码

代码来源 一步步优化:从数组到位运算(Python/Java/C++/Go/JS/Rust)。

class Solution {
public:int pseudoPalindromicPaths(TreeNode *root, int mask = 0) {if (root == nullptr) {return 0;}mask ^= 1 << root->val; // 修改 root->val 出现次数的奇偶性if (root->left == root->right) { // root 是叶子节点return (mask & (mask - 1)) == 0;}return pseudoPalindromicPaths(root->left, mask) +pseudoPalindromicPaths(root->right, mask);}
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n)


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

基于51单片机的FM数字收音机系统电路设计

**单片机设计介绍&#xff0c;基于51单片机的FM数字收音机系统电路设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的FM数字收音机系统是一种用于接收和播放FM广播信号的设备&#xff0c;以下是一个基本的电路设…

ubuntu22.04 安装 jupyterlab

JupyterLab Install JupyterLab with pip: pip install jupyterlabNote: If you install JupyterLab with conda or mamba, we recommend using the conda-forge channel. Once installed, launch JupyterLab with: jupyter lab

Pycharm创建项目新环境,安装Pytorch

在python项目中&#xff0c;很多项目使用的各类包的版本是不一致的。所以我们可以对每个项目有专属于它的环境。所以这个文章就是教你如何创建新环境。 一、创建新环境 首先我们需要去官网下载conda。然后在Pycharm下面添加conda的可执行文件。 用conda创建新环境。 二、…

CSS新特性(2-2)

CSS新特性&#xff08;2-2&#xff09; 前言box相关box-shadow background背景rgba颜色与透明度transform:rotate(Xdeg) 2D旋转transform:tranlate 平移 前言 本文继续讲解CSS3其他的新特性&#xff0c;想看之前新特性点击这里&#xff0c;那么好本文正式开始。 box相关 box…

开源与闭源

我的观点&#xff1a; 开源与闭源软件都有各自的优势和劣势&#xff0c;没有绝对的对错之分。.. 一、开源和闭源的优劣势比较 开源的好处与劣处 优势&#xff1a; 创新与合作&#xff1a;开源软件能够吸引更多的开发者参与到项目中来&#xff0c;促进创新和合作。开放的源代码…

【ArcGIS Pro微课1000例】0036:栅格影像裁剪与提取(矢量范围裁剪dem高程数据)

本实验讲解在ArcGIS Pro中进行栅格影像裁剪与提取(矢量范围裁剪dem高程数据)的方法。DEM、DOM、DSM等栅格数据方法也可以实现。 文章目录 一、加载实验数据二、裁剪工具的使用1. 裁剪栅格2. 按掩膜提取一、加载实验数据 加载配套实验数据包中的0036.rar中的dem数据和矢量裁剪…

jconsole的基本使用和死锁的检测

jconsole的基本使用和死锁的检测 因为jconsole是JDK自带的&#xff0c;所以安装了JDK就可以直接打开了。 1. 打开方式 cmd命令行打开&#xff1a;输入jconsole&#xff0c;然后按Enter JDK安装目录&#xff0c;bin目录下&#xff0c;双击即可打开 选择一个进程然后打开 可…

深入解析Selenium动作链:精通点击、拖拽、切换等操作

背景&#xff1a; 一些交互动作都是针对某个节点执行的。比如&#xff0c;对于输入框&#xff0c;我们就调用它的输入文字和清空文字方法&#xff1b;对于按钮&#xff0c;就调用它的点击方法。其实&#xff0c;还有另外一些操作&#xff0c;它们没有特定的执行对象&#xff0…

中国信通院王蕴韬:从“好用”到“高效”,AIGC需要被再次颠覆

当下AIGC又有了怎样的颠覆式技术&#xff1f;处于一个怎样的发展阶段&#xff1f;产业应用如何&#xff1f;以及存在哪些风险&#xff1f;针对这些问题&#xff0c;我们与中国信通院云计算与大数据研究所副总工程师王蕴韬进行了一次深度对话&#xff0c;从他哪里找到了这些问题…

电路 buck-boost相关知识

BUCK-BOOST 文章目录 BUCK-BOOST前言一、DC-DC工作模式电容电感特性伏秒积平衡原理 二、BUCK电路三、BOOST电路四、BUCK-BOOST电路总结 前言 最近需要用到buck-boost相关的电路知识&#xff0c;于是便写下这篇文章复习一下。 一、DC-DC 在学习buck-boost电路之前我们先来看一…

邮件泄密案例分析

近日&#xff0c;一起令人震惊的事件在美军方内部引发了广泛关注。据报道&#xff0c;美军方意外将数百万封包含敏感信息的邮件发至非洲国家马里。这些邮件涉及的内容十分广泛&#xff0c;包括军事行动计划、人员部署、战术策略等&#xff0c;甚至还有部分涉及国家安全和战略决…

前缀和——238. 除自身以外数组的乘积

文章目录 &#x1f377;1. 题目&#x1f378;2. 算法原理&#x1f365;解法一&#xff1a;暴力求解&#x1f365;解法二&#xff1a;前缀和&#xff08;积&#xff09; &#x1f379;3. 代码实现 &#x1f377;1. 题目 题目链接&#xff1a;238. 除自身以外数组的乘积 - 力扣&a…

代码随想录算法训练营第五十八天|739. 每日温度、496. 下一个更大元素 I

第十章 单调栈part01 739. 每日温度 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用…

小程序项目:springboot+vue基本微信小程序的学生健康管理系统

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时…

武汉教育E卡通学生证照片尺寸要求及证件照集中采集方法

”武汉教育E卡通“电子学生证旨在数字化中小学生身份&#xff0c;提供通用的教育卡&#xff0c;实现身份认证的电子化、权威化和集成化。校内一卡通系统包括刷卡考勤、电子班牌、图书借阅等&#xff0c;全面记录学生在校业务。同时&#xff0c;采集社会通行、实践活动等数据&am…

Redis大key与热Key

什么是 bigkey&#xff1f; 简单来说&#xff0c;如果一个 key 对应的 value 所占用的内存比较大&#xff0c;那这个 key 就可以看作是 bigkey。具体多大才算大呢&#xff1f;有一个不是特别精确的参考标准&#xff1a; bigkey 是怎么产生的&#xff1f;有什么危害&#xff1f;…

Redis数据备份和还原

Redis SAVE 命令用于创建当前数据库的备份文件&#xff0c;文件名默认为dump.rdb。备份数据库数据可以增强对数据的保护&#xff0c;提升数据的安全性。当数据不小心丢失或者被删除时&#xff0c;我们就可以通过相应的操作进行数据恢复。本节介绍 Redis 的数据备份和数据还原操…

MySQL表的操作『增删改查』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; MySQL 学习 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 &#x1f381;软件版本&#xff1a; MySQL 5.7.44 文章目录 1.创建表1.1.创建时指定属性 2.查看表2.1.查看表结构2.2.查看建表信息…

【SpringCloud】为什么选择微服务?

一般的平台会遇到的问题&#xff1a; 服务配置复杂。基础服务多&#xff0c;服务的资源配置复杂&#xff0c;传统方式管理服务复杂 服务之间调用复杂。检索服务、用户中心服务等&#xff0c;服务之间的调用复杂&#xff0c;依赖多 服务监控难度大。服务比较多&#xff0c;…

MYSQL基础知识之【数据类型】

文章目录 前言标题一数值类型日期和时间类型字符串类型后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错…