【题目】
给你一棵二叉树,每个节点的值为 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