給你一棵二叉樹,每個節點的值爲 1 到 9 。我們稱二叉樹中的一條路徑是 「僞迴文」的,當它滿足:路徑經過的所有節點值的排列中,存在一個迴文序列。
請你返回從根到葉子節點的所有路徑中 僞迴文 路徑的數目。
輸入: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] 。
輸入: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
思路:map記錄路徑上值出現的次數,如果map裏有2個數以上出現的次數是奇數,則構不成迴文路徑。
class Solution {
public:
int pseudoPalindromicPaths(TreeNode* root) {
unordered_map<int, int> vals;
int ans = 0;
dfs(root, vals, ans);
return ans;
}
void dfs(TreeNode* root, unordered_map<int, int>& vals, int& ans) {
if (root == nullptr) return;
vals[root->val]++;
if (root->left == nullptr && root->right == nullptr) {
ans += check(vals);
}
dfs(root->left, vals, ans);
dfs(root->right, vals, ans);
vals[root->val]--;
}
bool check(unordered_map<int, int>& vals) {
bool singleFlag = false;
for (auto it = vals.begin(); it != vals.end(); it++) {
if (it->second % 2 == 0) continue;
if (singleFlag) return false;
singleFlag = true;
}
return true;
}
};