LeetCode 1457. 二叉树中的伪回文路径:深度优先搜索(DFS) + 位运算优化

【LetMeFly】1457.二叉树中的伪回文路径:深度优先搜索(DFS) + 位运算优化

力扣题目链接:https://leetcode.cn/problems/pseudo-palindromic-paths-in-a-binary-tree/

给你一棵二叉树,每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的,当它满足:路径经过的所有节点值的排列中,存在一个回文序列。

请你返回从根到叶子节点的所有路径中 伪回文 路径的数目。

 

示例 1:

输入:root = [2,3,1,3,1,null,1]
输出:2 
解释:上图为给定的二叉树。总共有 3 条从根到叶子的路径:红色路径 [2,3,3] ,绿色路径 [2,1,1] 和路径 [2,3,1] 。在这些路径中,只有红色和绿色的路径是伪回文路径,因为红色路径 [2,3,3] 存在回文排列 [3,2,3] ,绿色路径 [2,1,1] 存在回文排列 [1,2,1] 。

示例 2:

输入:root = [2,1,1,1,3,null,null,null,null,null,1]
输出:1 
解释:上图为给定二叉树。总共有 3 条从根到叶子的路径:绿色路径 [2,1,1] ,路径 [2,1,3,1] 和路径 [2,1] 。这些路径中只有绿色路径是伪回文路径,因为 [2,1,1] 存在回文排列 [1,2,1] 。

示例 3:

输入:root = [9]
输出:1

 

提示:

  • 给定二叉树的节点数目在范围 [1, 105]
  • 1 <= Node.val <= 9

方法一:深度优先搜索(DFS) + 位运算优化

首先这道题组成“回文序列”时,每个数的顺序可变。因此不难发现,一个序列可以组成回文序列 等价于 这个序列要么每个数都出现了偶数次要么只有一个数出现了奇数次其他数都出现了偶数次

因此,我们只深度优先搜索,使用一个大小为 10 10 10的数组(节点中每个数的范围是1-9)存储每个数出现的次数。当搜索到叶节点时,看数组中元素出现的次数是否满足上方要求即可。

如何使用位运算进行优化呢?我们可以使用一个数的低 10 10 10位来存储“某个数出现了奇数次还是偶数次”这一信息。若出现奇数次则这一位为1,出现偶数次则这一位为0。

这样,在遍历过程中,若当前节点值为 a a a,就将 m a s k mask mask异或上 ( 1 < < a ) (1<<a) (1<<a)

最终看 m a s k mask mask是否最多有一个 1 1 1的时候,可以借助lowbit的思想。若KaTeX parse error: Expected 'EOF', got '&' at position 14: mask = (mask &̲ -mask)则mask二进制下最多有1个1。

  • 6 = ( 110 ) 2 6=(110)_2 6=(110)2 l o w b i t ( 6 ) = ( 10 ) 2 lowbit(6)=(10)_2 lowbit(6)=(10)2
  • 12 = ( 1100 ) 2 12=(1100)_2 12=(1100)2 l o w b i t ( 12 ) = ( 100 ) 2 lowbit(12)=(100)_2 lowbit(12)=(100)2

以上。

  • 时间复杂度 O ( n ) O(n) O(n),其中 n n n是二叉树节点个数
  • 空间复杂度 O ( n ) O(n) O(n)。若二叉树退化成一个直链,则递归消耗 O ( n ) O(n) O(n)的空间

AC代码

C++
class Solution {
private:int ans;void dfs(TreeNode* root, int mask) {mask ^= (1 << root->val);if (!root->left && !root->right) {ans += __builtin_popcount(mask) < 2;}if (root->left) {dfs(root->left, mask);}if (root->right) {dfs(root->right, mask);}}public:int pseudoPalindromicPaths (TreeNode* root) {ans = 0;dfs(root, 0);return ans;}
};
Python
class Solution:def dfs(self, root: TreeNode, mask: int) -> None:mask ^= (1 << root.val)if not root.left and not root.right:self.ans += mask == (mask & -mask)if root.left:self.dfs(root.left, mask)if root.right:self.dfs(root.right, mask)def pseudoPalindromicPaths (self, root: TreeNode) -> int:self.ans = 0self.dfs(root, 0)return self.ans

同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/134617854

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

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

相关文章

设计师不可错过的免费素材网站,快快收藏!

即时设计资源广场 即时设计资源广场拥有数万件来自优秀设计师的精美设计作品&#xff0c;包括设计规范、页面、插图、图标、产品原型、投资组合等。这些作品通常是由大型工厂团队精心总结的设计规范&#xff0c;对应于完善的设计系统和支持组件库。此外&#xff0c;还涵盖了各…

vue项目多个不同的服务器请求地址管理

vue项目多个不同的服务器请求地址管理 在vue项目开发过程中,获取不同的数据可能会出现需要请求多个不同服务器地址的域名,这个时候需要对不同域名的请求地址进行管理以及跨域的代理。 一、单服务器域名地址的跨域代理和请求配置: 跨域配置: 在vue项目的vue.config.js文件…

玻色量子企业荣誉

2023年 2023.7 玻色量子创始人&COO马寅荣获“优秀共产党员”荣誉称号 2023.4 斩获“双金”&#xff01;玻色量子在中国移动第七届创客马拉松大赛脱颖而出 2023.1 再创佳绩&#xff01;玻色量子荣膺2022年德勤中国“朝阳明日之星” 2023.1 玻色量子荣为第二届朝阳区“…

提升企业网络安全的得力助手——EventLog Analyzer网络日志管理

在当今数字化时代&#xff0c;企业的网络安全问题变得尤为重要。为了更好地应对日益增多的威胁和安全漏洞&#xff0c;企业需要一种高效的网络日志管理工具&#xff0c;EventLog Analyzer便是其中一款卓越的解决方案。 EventLog Analyzer EventLog Analyzer是一款综合性的网络…

更高效的图片预览方案

传统的图片预览方式是什么样子的呢&#xff1f; 首先是用户选择一张图片&#xff0c;通过ajax上传到服务器&#xff0c;然后服务器返回一个访问url 然后给img标签的src属性设置这个访问url。 那这就会有一个问题&#xff0c;用户为什么要先网络上传上去再预览呢&#xff0c;我…

大模型的实践应用9-利用LoRA方法在单个GPU上微调FLAN-T5模型的过程讲解与实现

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下大模型的实践应用9-利用LoRA方法在单个GPU上微调FLAN-T5模型的过程讲解与实现&#xff0c;文本我们将向您展示如何应用大型语言模型的低秩适应(LoRA)在单个GPU上微调FLAN-T5 XXL(110 亿个参数)模型。我们将利用Tran…

大电流和大电压谁对人体伤害大

突然想起以前看的这个&#xff0c; 网上有很多解答了这个问题&#xff0c;答案是大电流比大电压对人体伤害大。 我之所以重新来写些&#xff0c; 是想起一种有趣的比喻&#xff0c; 这个答案不绝对。 先看一个场景&#xff0c; 一群牛和一头老虎对你冲来&#xff0c; 谁对你的…

成为网络安全高手!教你如何做出专业级别的渗透测试

01、信息收集 1、域名、IP、端口 域名信息查询&#xff1a;信息可用于后续渗透 IP信息查询&#xff1a;确认域名对应IP&#xff0c;确认IP是否真实&#xff0c;确认通信是否正常 端口信息查询&#xff1a;NMap扫描&#xff0c;确认开放端口 发现&#xff1a;一共开放两…

linux 内核线程

内核线程类似于用户进程&#xff0c;通常用于并发处理些工作&#xff0c;它是一种在内核空间实现后台任务的方式&#xff0c;并且可以参与时间片轮转调度。 内核线程可以进行繁忙的异步事件处理&#xff0c;也可以睡眠等待某事件的发生&#xff0c;内核线程可以访问内核函数和…

分层理解Java字符串常量池

Java是一门计算机编程语言&#xff0c;但我们脑海中所理解的Java不仅仅是一门语言。它还包括Java虚拟机&#xff08;JVM&#xff09;的一系列规定&#xff0c;及具体Java产品&#xff08;如Hotspot&#xff09;的实现原理。 不管我们日常在Java中用到的任何一种语法&#xff0…

深度学习之图像分类(十四)CAT: Cross Attention in Vision Transformer详解

IPSA和CPSA的处理流程、维度变换细节 FLOPs的计算方法、以及flops和划分的patch数目以及patch的维度计算关系 IPSA如何进行local attention、CPSA如何进行globe attention CAT的代码详细注释---需要学习完Transformer TNT、swin transformer、crossViT CAT: Cross Atten…

P9240 [蓝桥杯 2023 省 B] 冶炼金属(比值问题)

数学分析&#xff1a; 1. max(最大比值) A/B 余数p&#xff08;p<B&#xff09; > Amax*Bp 反证&#xff1a;若max不为最大,则设maxn为最大比值 (maxn)*Bmax*Bn*Bp1 > A (n*Bp1 > p ,矛盾) 故max为最大比值 2.min(最小比值…