1457. 二叉树中的伪回文路径
- 题目
- 算法设计:深度优先搜索
题目
传送门:https://leetcode.cn/problems/pseudo-palindromic-paths-in-a-binary-tree/
算法设计:深度优先搜索
如何判断一组数字是否存在一个回文串组合?
如 [1, 2, 1]、[2, 1, 1]、[2, 3, 3]、[3, 2, 3]。
规律是:一组数字中,有且只有一个数字出现的次数为奇数,剩余数字的出现次数均为偶数,这组数字组成一个回文串。
如果想要构成伪回文串,路径上的至多只能有 1
个奇数数字存在,其他数字都必须是偶数。
因为节点的值只有 1-9
,可以用 1bit
表示 1
个数字出现次数是奇数还是偶数,用 9bit
就可以表示 9
个数字出现是奇数还是偶数。
伪回文对,有俩种情况:
- 121,只有
1
个 bit 是 1 - 1221,全部为
0
的情况下是伪回文对。
class Solution {
public:
int pseudoPalindromicPaths(TreeNode* root, int count = 0) {
if (!root) return 0;
count = count ^ (1 << root->val);
// 如果该数字个数为奇数,count为1,否则为0
// ^:异或让成对数字变0,落单数字不变
// 1 << n:把 1 左移 n 位,每左移一位就是*2,节点范围是 1-9
int res = pseudoPalindromicPaths(root->left, count) + pseudoPalindromicPaths(root->right, count);
// 非叶子节点返回其子节点的伪回文数
if (root->left == root->right && (count & (count - 1)) == 0) res++;
// 叶子节点,有且只有一个奇数
// n & (n-1):二进制数 n 最后位置的 1 变为 0
// 满足条件,伪回文数 + 1
return res;
}
};