1457. 二叉樹中的偽回文路徑
給你一棵二叉樹,每個節點的值為 1 到 9 。我們稱二叉樹中的一條路徑是 「偽回文」的,當它滿足:路徑經過的所有節點值的排列中,存在一個回文序列。
請你返回從根到葉子節點的所有路徑中 偽回文 路徑的數目。
示例 1:
輸入:root = [2,3,1,3,1,null,1]
輸出:2
解釋:上圖為給定的二叉樹。總共有 3 條從根到葉子的路徑:紅色路徑 [2,3,3] ,綠色路徑 [2,1,1] 和路徑 [2,3,1] 。
在這些路徑中,只有紅色和綠色的路徑是偽回文路徑,因為紅色路徑 [2,3,3] 存在回文排列 [3,2,3] ,綠色路徑 [2,1,1] 存在回文排列 [1,2,1] 。
示例 2:
輸入:root = [2,1,1,1,3,null,null,null,null,null,1]
輸出:1
解釋:上圖為給定二叉樹。總共有 3 條從根到葉子的路徑:綠色路徑 [2,1,1] ,路徑 [2,1,3,1] 和路徑 [2,1] 。
這些路徑中只有綠色路徑是偽回文路徑,因為 [2,1,1] 存在回文排列 [1,2,1] 。
示例 3:
輸入:root = [9]
輸出:1
提示:
- 給定二叉樹的節點數目在范圍 [1, 105] 內
- 1 <= Node.val <= 9
偽回文條件:二進制表示中只有最多一個位為1(奇數次)
遞歸遍歷樹的每一個節點并記錄路徑,使用位運算檢查是否為偽回文路徑:
/*** 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) {return countPaths(root, 0);}int countPaths(TreeNode* node, int pathSta) {if (!node) {return 0;}// 使用位運算更新路徑狀態pathStatus ^= (1 << node->val);// 如果是葉子節點,檢查路徑是否是偽回文if (!node->left && !node->right) {return (pathSta & (pathSta - 1)) == 0;}// 遞歸計算左右子樹的偽回文路徑數int leftCount = countPaths(node->left, pathSta);int rightCount = countPaths(node->right, pathSta);return leftCount + rightCount;}
};
至于位運算,靈神有篇文章寫得很好,讀者可以看看:從集合論到位運算,常見位運算技巧分類總結!