力扣 二叉樹中的僞迴文路徑

給你一棵二叉樹,每個節點的值爲 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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章