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;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值