Given a binary tree where node values are digits from 1 to 9. A path in the binary tree is said to be pseudo-palindromic if at least one permutation of the node values in the path is a palindrome.
Return the number of pseudo-palindromic paths going from the root node to leaf nodes.
Example 1:
Input: root = [2,3,1,3,1,null,1] Output: 2 Explanation: The figure above represents the given binary tree. There are three paths going from the root node to leaf nodes: the red path [2,3,3], the green path [2,1,1], and the path [2,3,1]. Among these paths only red path and green path are pseudo-palindromic paths since the red path [2,3,3] can be rearranged in [3,2,3] (palindrome) and the green path [2,1,1] can be rearranged in [1,2,1] (palindrome).
Example 2:
Input: root = [2,1,1,1,3,null,null,null,null,null,1] Output: 1 Explanation: The figure above represents the given binary tree. There are three paths going from the root node to leaf nodes: the green path [2,1,1], the path [2,1,3,1], and the path [2,1]. Among these paths only the green path is pseudo-palindromic since [2,1,1] can be rearranged in [1,2,1] (palindrome).
Example 3:
Input: root = [9] Output: 1
Constraints:
- The given binary tree will have between
1
and10^5
nodes. - Node values are digits from
1
to9
.
class Solution { public int pseudoPalindromicPaths (TreeNode root) { return search(root, new HashSet<>()); } public int search(TreeNode tn, HashSet<Integer> set) { if (tn == null) { return 0; } if (set.contains(tn.val)) { set.remove(tn.val); } else { set.add(tn.val); } int res = 0; if (tn.left == null && tn.right == null && set.size() <= 1) { res++; } res += search(tn.left, new HashSet(set)) + search(tn.right, new HashSet(set)); return res; } }
class Solution { int count = 0; public int pseudoPalindromicPaths (TreeNode root) { dfs(root, new HashSet<>()); return count; } private void dfs(TreeNode node, Set<Integer> set) { if(node !=null) { if(set.contains(node.val)) set.remove(node.val); else set.add(node.val); if(node.left ==null && node.right == null) { if(set.size() <=1) count++; } else { dfs(node.left, new HashSet<>(set)); dfs(node.right, new HashSet<>(set)); } } } }