給你一棵二叉樹,每個節點的值爲 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
之間。
C++
/**
* 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 ans=0;
vector<vector<int>> res;
void dfs(TreeNode* root, vector<int> tmp)
{
if(root)
{
tmp.push_back(root->val);
if(root->left==NULL && root->right==NULL)
{
res.push_back(tmp);
}
else
{
dfs(root->left,tmp);
dfs(root->right,tmp);
}
}
}
int pseudoPalindromicPaths (TreeNode* root)
{
vector<int> tmp;
dfs(root,tmp);
for(auto v:res)
{
map<int,int> m;
for(auto it:v)
{
m[it]++;
}
int count=0;
for(auto it:m)
{
if(it.second%2==1)
{
count++;
}
}
if(count<=1)
{
ans++;
}
}
return ans;
}
};