题目描述
给你一棵二叉树,每个节点的值为 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;
}
}