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;        
    }
};
相关推荐
HalvmånEver1 分钟前
Linux:Ext系列⽂件系统(三)
linux·运维·服务器
伍叁_2 分钟前
shell脚本案例
linux·运维·服务器
qq_5470261792 分钟前
Linux 文件与目录管理
linux·运维·服务器
zore_c3 分钟前
【数据结构】队列——超详解!!!(包含队列的实现)
c语言·网络·数据结构·c++·笔记·算法·链表
小杰帅气5 分钟前
智能指针喵喵喵
开发语言·c++·算法
云声风语6 分钟前
buuCTF练习题misc大白记一次vim配合xxd使用
linux·编辑器·vim
南棱笑笑生7 分钟前
20251219给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-5.10】后解决启动不了报atf-2的问题
linux·c语言·开发语言·rockchip
艾莉丝努力练剑13 分钟前
【Linux进程(四)】深入理解 Linux O(1) 调度器:双队列轮转与进程优先级机制——如何避免进程饥饿,实现公平且高效的进程调度
java·大数据·linux·运维·服务器·人工智能·安全
智驱力人工智能14 分钟前
守护生命的水上之眼 无人机人员落水检测系统的技术攻坚与应用实践 无人机溺水识别 山区水库无人机落水检测系统 水域安全无人机部署指南
大数据·人工智能·算法·安全·无人机·边缘计算
hweiyu0016 分钟前
排序算法选型决策树
算法·排序算法