Leetcode 1457.二叉樹中的僞迴文路徑
1 題目描述(Leetcode題目鏈接)
給你一棵二叉樹,每個節點的值爲 1 到 9 。我們稱二叉樹中的一條路徑是 「僞迴文」的,當它滿足:路徑經過的所有節點值的排列中,存在一個迴文序列。
請你返回從根到葉子節點的所有路徑中 僞迴文 路徑的數目。
輸入: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] 。
提示:
- 給定二叉樹的節點數目在 1 到 10^5 之間。
- 節點值在 1 到 9 之間。
2 題解
記錄一條路徑每個數字出現的次數,如果出現奇數次的數字個數不超過1,則包含僞迴文串,這裏用一個九位的二進制碼以及異或運算來表示每個數字出現次數的奇偶。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def pseudoPalindromicPaths (self, root: TreeNode) -> int:
self.res = 0
def dfs(root, n):
n^=1<<root.val
if not root.left and not root.right:
if not n or not n&(n-1):
self.res+=1
if root.left:
dfs(root.left, n)
if root.right:
dfs(root.right, n)
dfs(root, 0)
return self.res