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;
    }
}

你可能感兴趣的:(每日一题,二叉树,数据结构,leetcode)