这道题的难点在于如何去构造回文?
对于回文,分两种情况
- 偶数回文,如2112,每个数字都出现了偶数次,
- 奇数回文,如21312,只有中间的数字出现了奇数次
只要是符合这两种情况的数组,是一定能构成回文的,如何去构造这个数组?
题目中说了,允许将结点中的数字重新排列,在我们获取到了某个结点中的数字后,可以采用 数组 的方式来维护.
st[2] ^= 1; 1
st[3] ^= 1; 1
st[3] ^= 1; 0
用数组来维护路径中数字出现的次数,出现奇数次为1,出现偶数次为0.
可以考虑使用异或^
构造回文的问题解决了,代码就好写了.
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int dfs(TreeNode* root, vector<int>& st)
{
if (root == nullptr) return 0;
st[root->val] ^= 1;
int ret = 0;
if (root->left == root->right)
{
ret = accumulate(st.begin(), st.end(), 0) <= 1;
}
else
{
ret = dfs(root->left, st) + dfs(root->right, st);
}
st[root->val] ^= 1;
return ret;
}
int pseudoPalindromicPaths (TreeNode* root) {
vector<int> st(11, 0);
return dfs(root, st);
}
};