【树-中等】1457. 二叉树中的伪回文路径

题目
给你一棵二叉树,每个节点的值为 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 到 10^5 之间。
节点值在 1 到 9 之间。

【代码】
在这里插入图片描述

class Solution:
    def dfs(self,root):
        if not root:
            return 
        self.ans.append(root.val)
        if root.val in self.count:
            self.count[root.val]+=1
        else:
            self.count[root.val]=1
        if not root.left and not root.right:
            cnt=0
            for x in self.count:
                if self.count[x]%2:
                    cnt+=1
            if cnt<=1:
                self.cnt+=1
        self.dfs(root.left)
        self.dfs(root.right)
        temp=self.ans.pop()
        self.count[temp]-=1

    def pseudoPalindromicPaths (self, root: TreeNode) -> int:
        self.ans=[]
        self.count=dict()
        self.cnt=0
        self.dfs(root)
        return self.cnt

【方法2】
在这里插入图片描述

class Solution:
    def dfs(self,root,temp):
        n=temp^(1<<root.val)
        if not root.left and not root.right:
            if n==0 or (n&(n-1))==0:
                self.ans+=1
        if root.left:
            self.dfs(root.left,n)
        if root.right:
            self.dfs(root.right,n)
    def pseudoPalindromicPaths (self, root: TreeNode) -> int:
        if not root:
            return 0
        self.ans=0
        self.dfs(root,0)
        return self.ans

Guess you like

Origin blog.csdn.net/kz_java/article/details/119799150