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

news/2024/7/20 20:56:29 标签: leetcode, 深度优先, 题解, 二叉树, DFS

DFS___1">【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___51">方法一:深度优先搜索(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 = 0
        self.dfs(root, 0)
        return self.ans

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


http://www.niftyadmin.cn/n/5221506.html

相关文章

OJ练习第186题——统计子串中的唯一字符

统计子串中的唯一字符 力扣链接&#xff1a;828. 统计子串中的唯一字符 题目描述 我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符&#xff0c;并返回唯一字符的个数。 例如&#xff1a;s “LEETCODE” &#xff0c;则其中 “L”, “T”,“C”,“O”…

oracle查询开始时间和结束时间之间的连续月份

SELECT TO_CHAR(ADD_MONTHS(TO_DATE(2023-01,YYYY-MM), ROWNUM - 1), YYYY-MM) AS fmonth FROM DUALCONNECT BY ROWNUM < CEIL(MONTHS_BETWEEN(TO_DATE(2023-11, YYYY-MM), TO_DATE(2023-01,YYYY-MM))1)

助力企业实现更简单的数据库管理,ATOMDB 与 TDengine 完成兼容性互认

为加速数字化转型进程&#xff0c;当下越来越多的企业开始进行新一轮数据架构改造升级。在此过程中&#xff0c;全平台数据库管理客户端提供了一个集中管理和操作数据库的工具&#xff0c;提高了数据库管理的效率和便利性&#xff0c;减少了人工操作的复杂性和错误率&#xff0…

海外网红挑选指南:6个方法轻松辨真伪,保障合作最佳效果!

随着社交媒体的飞速发展&#xff0c;海外网红营销已经成为品牌推广的重要渠道之一。然而&#xff0c;与日俱增的网红数量也给广告主带来了选择的困扰&#xff0c;因为市场上充斥着各种水分和虚假的网红。为了确保广告效果最大化&#xff0c;广告主需要学会识别真实的海外网红&a…

内核延时函数sleep和delay

延时函数 linux 驱动开发过程中&#xff0c;经常会用到延迟函数&#xff1a;udelay&#xff0c;mdelay&#xff0c;usleep&#xff0c;msleep&#xff0c;usleep_range。这几个延时函数优先使用usleep_range其次是usleep最后udelay。 1、delay和sleep的区别 delay&#xff0…

计算机服务器中了mallox勒索病毒如何处理,mallox勒索病毒解密文件恢复

科技技术的发展推动了企业的生产运营&#xff0c;网络技术的不断应用&#xff0c;极大地方便了企业日常生产生活&#xff0c;但网络毕竟是一把双刃剑&#xff0c;网络安全威胁一直存在&#xff0c;近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机…

来自2023 TM Forum 数字领导力中国峰会的邀请函

峰会介绍 2023数字领导力中国峰会由tmforum和亚信科技联合主办。 数据驱动创新&#xff0c;数字塑造未来&#xff01;2023数字领导力中国峰会&#xff0c;立足技术和商业视角&#xff0c;聚焦讨论各行业如何依托数据治理、IT和网络转型&#xff0c;实现跨越式增长。 这里&am…

第四章 python基础之面向对象

第四章 面向对象 1. 简述面向对象的三大特性。 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;的三大特性是 封装&#xff08;Encapsulation&#xff09;、继承&#xff08;Inheritance&#xff09;和多态&#xff08;Polymorphism&#x…