190場周賽-5418. 二叉樹中的僞迴文路徑(20200524)

題目描述

給你一棵二叉樹,每個節點的值爲 1 到 9 。我們稱二叉樹中的一條路徑是 「僞迴文」的,當它滿足:路徑經過的所有節點值的排列中,存在一個迴文序列。

請你返回從根到葉子節點的所有路徑中 僞迴文 路徑的數目。

題目分析

看到本題目,首先想到的是要把從根節點到葉子節點的路徑上的值存儲下來,當到達葉子節點後,對當前路徑上的值進行分析。由題意「每個節點的值爲1到9」,所以一個大小爲10的數組就可以統計路徑上的節點值。

如果當前路徑上,「相同節點值出現頻度次數爲奇數」的次數 > 1,那麼當前路徑上的節點值一定不是符合要求的“僞迴文”的答案。“僞迴文”的要求是經過排序後,節點值可以組成一個迴文數組。反之,當「相同節點值出現頻度次數爲奇數」的次數 <= 1,其他節點值頻度次數爲偶數,那麼就一定是符合“僞迴文”的答案。

參考代碼

public class PseudoPalindromicPaths {
    // 記錄符合要求的路徑數
    int r = 0;

    private void go(TreeNode rt, int[] d) {
        if (rt == null) {
            return;
        }
        // 當前節點的值+1
        d[rt.val]++;
        // 當前節點爲葉子節點。
        if (rt.left == null && rt.right == null) {
            int ct = 0;
            // 統計當前的路徑上,值爲奇數的個數。如果爲奇數的個數 > 1,那麼一定不能組成迴文串。
            for (int i = 1; i <= 9; ++i) {
                if (d[i] % 2 == 1) {
                    ct++;
                }
            }
            // 如果爲奇數的值爲1或0,則是一個符合要求的答案。
            if (ct == 1 || ct == 0) {
                r++;
            }
            // 當前值--,意味着回到當前節點的父節點。
            d[rt.val]--;
            return;
        }
        // 遞歸處理
        go(rt.left, d);
        go(rt.right, d);
        d[rt.val]--;
    }

    // 使用遞歸的方法來解決。
    public int pseudoPalindromicPaths(TreeNode root) {
        go(root, new int[10]);
        return r;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章