Leetcode 1457. Pseudo-Palindromic Paths in a Binary Tree (二叉树遍历题)

  1. Pseudo-Palindromic Paths in a Binary Tree
    Medium
    Given a binary tree where node values are digits from 1 to 9. A path in the binary tree is said to be pseudo-palindromic if at least one permutation of the node values in the path is a palindrome.

Return the number of pseudo-palindromic paths going from the root node to leaf nodes.

Example 1:

Input: root = [2,3,1,3,1,null,1]

Output: 2

Explanation: The figure above represents the given binary tree. There are three paths going from the root node to leaf nodes: the red path [2,3,3], the green path [2,1,1], and the path [2,3,1]. Among these paths only red path and green path are pseudo-palindromic paths since the red path [2,3,3] can be rearranged in [3,2,3] (palindrome) and the green path [2,1,1] can be rearranged in [1,2,1] (palindrome).

Example 2:

Input: root = [2,1,1,1,3,null,null,null,null,null,1]

Output: 1

Explanation: The figure above represents the given binary tree. There are three paths going from the root node to leaf nodes: the green path [2,1,1], the path [2,1,3,1], and the path [2,1]. Among these paths only the green path is pseudo-palindromic since [2,1,1] can be rearranged in [1,2,1] (palindrome).

Example 3:

Input: root = [9]

Output: 1

Constraints:

The number of nodes in the tree is in the range [1, 105].

1 <= Node.val <= 9

解法1:

注意:这里的path是指从root到leaf。

怎么才能算pseudo-palindromic呢? 只要统计出1-9每个数字的个数,如果奇数个的个数<=1就算!

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int pseudoPalindromicPaths (TreeNode* root) {
        pathNum.resize(10, 0);
        helper(root);
        return count;
    }
private:
    vector<int> pathNum;
    int count = 0;
    void helper(TreeNode *root) {
        if (!root) return;
        pathNum[root->val]++;
        if (!root->left && !root->right) {
            int oddNum = 0, evenNum = 0;
            for (int i = 1; i <= 9; i++) {
                if (pathNum[i] & 0x1) oddNum++;
                else evenNum++;
            }
            if (oddNum <= 1) {
                count++;
                //return;
            }
            pathNum[root->val]--; //记得这里也要--
            return;
        }
        helper(root->left);
        helper(root->right);
        pathNum[root->val]--;
        return;        
    }
};

解法2:思路跟上面差不多,但是用XOR。

注意:

  1. bitwise的操作优先级都很低,要加括号。比如
    (pathXor & (pathXor - 1)) == 0
    pathXor ^= (0x1 << (root->val));
  2. 要用 pathXor ^= (0x1 << (root->val)), 不能直接用pathXor ^= root->val。
    否则如果有多个数的个数是奇数的话,pathXor看不出来。
    用pathXor ^= (0x1 << (root->val))的话,1-9每个数字个数是奇数还是偶数就一目了然了。
  3. int x。 x & (x-1)会抹掉最后一个1。那么如果x=0的话,是不是也成立呢? 是的,因为0&(-1)=0.
    所以,如果pathXor有一个1,或者为全0,那么pathXor & (pathXor - 1)都是0。这个就可以作为有pseudo-palindromic的评判标准。
cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int pseudoPalindromicPaths (TreeNode* root) {
        helper(root);
        return count;
    }
private:
    int pathXor = 0;
    int count = 0;
    void helper(TreeNode *root) {
        if (!root) return;
        pathXor ^= (0x1 << (root->val));
        if (!root->left && !root->right) {
            if ((pathXor & (pathXor - 1)) == 0) count++;
            pathXor ^= (0x1 << (root->val));
            return;
        }
        helper(root->left);
        helper(root->right);
        pathXor ^= (0x1 << (root->val));
        return;        
    }
};
相关推荐
CoovallyAIHub4 分钟前
如何在 2025 年构建强大的实时视频检测?
深度学习·算法·计算机视觉
CoovallyAIHub27 分钟前
2025 年度 AI 行业百科《State of AI 2025》来了!推理元年、算力焦虑与价值回归
深度学习·算法·计算机视觉
艾莉丝努力练剑37 分钟前
【C++STL :list类 (二) 】list vs vector:终极对决与迭代器深度解析 && 揭秘list迭代器的陷阱与精髓
linux·开发语言·数据结构·c++·list
寒冬没有雪1 小时前
矩阵的翻转与旋转
c++·算法·矩阵
ʚ希希ɞ ྀ1 小时前
二叉树的层序遍历
数据结构·算法
m0_743106461 小时前
【VGGT-X】:尝试将VGGT用到3DGS重建中去
人工智能·算法·计算机视觉·3d·几何学
十二imin1 小时前
霍夫丁不等式详解
算法·机器学习·概率论
Giser探索家1 小时前
建筑物孪生模型:重构空间数字化格局,赋能智慧城市
大数据·人工智能·算法·重构·分类·云计算·智慧城市
Tiny番茄1 小时前
leetcode 3. 无重复字符的最长子串
数据结构·python·算法·leetcode
---学无止境---1 小时前
Linux中页面分配alloc_pages相关函数
linux