一魚再吃 用DFS來計算有幾條 偽回文路徑 Leetcode #1457

閱讀時間約 9 分鐘

題目敘述

題目給定我們一顆二元樹的根節點,要求我們計算出從根節點到葉子節點的偽回文路徑路徑有幾條?

偽回文路徑路徑 的定義:

路徑經過重新排列之後,可以形成回文Palindrome,也就是頭尾鏡像對稱。 ​

例如:

1 -> 3 -> 3

重新排列之後,可以形成

3 -> 1 -> 3 回文

從頭讀到尾是313

從尾讀到頭也是313


題目的原文敘述


測試範例

Example 1:

raw-image
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).

2 -> 3 -> 3 可以重排成 3 -> 2 -> 3 回文
2 -> 1 -> 1 可以重排成 1 -> 2 -> 1 回文​

Example 2:

raw-image

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))

2 -> 1 -> 1 可以重排成 1 -> 2 -> 1 回文​。

Example 3:

Input: root = [9]
Output: 1

9 可以重排成 9 本身就是回文。

約束條件

Constraints:

  • The number of nodes in the tree is in the range [1, 10^5].

節點總數目介於1 ~ 10^5 之間。

  • 1 <= Node.val <= 9

每個節點的值一定介於1 ~ 9 之間。


演算法

這題的關鍵在於: 什麼條件,可以讓路徑重排之後形成回文?

那就回頭檢視回文具有怎樣的結構,或者說 回文具有怎樣的pattern?


其實,回文總共只有兩種結構


第一種,具有中心元素的回文。

可以抽象化成 Head + Center + Tail,其中 Tail = Head的逆序(也就是彼此互為鏡像)

例如:

1 2 3 4 3 2 1, Head = 1 2 3, Center = 4, Tail=3 2 1

頭尾的元素一定都出現偶數次? 為什麼,因為彼此互為鏡像,一半的次數在Head,一半的次數在Tail。

只有Center 元素,4的出現次數是奇數次。


第二種,不具有中心元素的回文。

可以抽象化成 Head + Tail,其中 Tail = Head的逆序(也就是彼此互為鏡像)

例如:

1 2 3 3 2 1, Head = 1 2 3, Tail=3 2 1

頭尾的元素一定都出現偶數次? 為什麼,因為彼此互為鏡像,一半的次數在Head,一半的次數在Tail。


因此,到這邊,可以歸納出一個結論,要重新排列形成回文palindrome的話,最多只能有一個元素的出現次數是奇數次


因次,我們可以用DFS去遞迴展開,從上到下探索整棵樹,檢查並且計算有幾條路徑滿足這個條件:

最多只能有一個元素的出現次數是奇數次


在記錄出現次數的時候,我們使用toggle bit flag的技巧去紀錄數字1~數字9的出現次數。

凡是出現偶數次的數字,都會toggle bit偶數次,相當於做xor bit mask兩次,對應到的就是bit flag為0。

凡是出現奇數次的數字,都會toggle bit奇數次,相當於做xor bit mask一次,對應到的就是bit flag為1。

最後檢查每條從上到下的路徑所對應的bit flag (occurrence)有沒有滿足最多只能有一個元素的出現次數是奇數次即可。


程式碼

# 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: Optional[TreeNode]) -> int:

## Parameter
# node: tree node
# occurrence: bit flag for number 1 ~ 9
def check(node=None, occurrence=0):

# Base case for empty tree
if not node:
return 0

# Toggle bit flag for current node value
occurrence ^= (1 << node.val)

# Count pseudo palindromeic path in current tree
palin_count = check(node.left, occurrence) + check(node.right, occurrence)

if not node.left and not node.right:
# Now, we are at leaf node, update pseudo palindromeic path count if at most one number has odd occurrence
palin_count += ( (occurrence & occurrence-1) == 0 )

return palin_count

# ======================================
return check(node=root, occurrence=0)

複雜度分析

時間複雜度:

從上到下用DFS探索整棵樹,檢查每條從樹根到葉子的路徑,所需時間為O(n)。

空間複雜度:

從上到下用DFS探索整棵樹,遞迴深度最深為O(n),發生在整棵樹向左歪斜或向又歪斜的時候。


關鍵知識點

這題的關鍵在於: 什麼條件,可以讓路徑重排之後形成回文?

那就回頭檢視回文具有怎樣的結構,或者說 回文具有怎樣的pattern?


其實,回文總共只有兩種結構


第一種,具有中心元素的回文,可以抽象化成 Head + Center + Tail

第二種,不具有中心元素的回文,可以抽象化成 Head + Tail


要重新排列形成回文palindrome的話,最多只能有一個元素的出現次數是奇數次


Reference:

[1] Python O(n) by DFS // At most one number with odd occurrence. [w/ Simple proof]

82會員
417Content count
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述 題目會給定一個字串陣列arr最為輸入,我們可以任意選擇一組不包含重複字元的陣列子序列,將字串進行串接,成為字串s,請問字串s的最大長度是多少? 例如: arr=["dog","cow","cat"] 我們可以選擇"dog", "cat"進行串接,得到的字串s="dogcat",s的
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 問我們任意祖先節點和晚輩節點之間,最大的差值的絕對值是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [8,3,10,1,6,null,14,null,null,4,7,13] Ou
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 並且給定感染的病毒源節點位置,每個單位時間,可以向相鄰的節點感染一次,問我們需要多少時間去感染整棵樹? 題目的原文敘述 測試範例 Example 1: Input: root = [1,5,3,null,4,10,6,
題目敘述 題目會給定我們一顆二元搜索樹BST的根結點, 還有一個指定區間的上邊界R 和 下邊界L。 請問二元搜索樹中,所有落在指定區間內的節點元素值的總和是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [10,5,15,3,7,null,18], l
題目敘述 題目會給我們一個輸入陣列prerequisites,每個pair代表兩個課程之間的先修關係,和課程總數numCourses。 題目問我們這組課程表是否能依照順序修完所有的課程? 如果可以,返回True。 如果不行,代表有擋修形成死結,無法依照順序修完所有的課程,返回False。
題目敘述 題目會給定我們一顆二元搜索樹的根結點root,和任意兩個樹中的節點p和q。 要求我們找出p, q最靠近的公共祖先節點。 題目的原文敘述 測試範例 Example 1: Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q
題目敘述 題目會給定一個字串陣列arr最為輸入,我們可以任意選擇一組不包含重複字元的陣列子序列,將字串進行串接,成為字串s,請問字串s的最大長度是多少? 例如: arr=["dog","cow","cat"] 我們可以選擇"dog", "cat"進行串接,得到的字串s="dogcat",s的
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 問我們任意祖先節點和晚輩節點之間,最大的差值的絕對值是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [8,3,10,1,6,null,14,null,null,4,7,13] Ou
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 並且給定感染的病毒源節點位置,每個單位時間,可以向相鄰的節點感染一次,問我們需要多少時間去感染整棵樹? 題目的原文敘述 測試範例 Example 1: Input: root = [1,5,3,null,4,10,6,
題目敘述 題目會給定我們一顆二元搜索樹BST的根結點, 還有一個指定區間的上邊界R 和 下邊界L。 請問二元搜索樹中,所有落在指定區間內的節點元素值的總和是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [10,5,15,3,7,null,18], l
題目敘述 題目會給我們一個輸入陣列prerequisites,每個pair代表兩個課程之間的先修關係,和課程總數numCourses。 題目問我們這組課程表是否能依照順序修完所有的課程? 如果可以,返回True。 如果不行,代表有擋修形成死結,無法依照順序修完所有的課程,返回False。
題目敘述 題目會給定我們一顆二元搜索樹的根結點root,和任意兩個樹中的節點p和q。 要求我們找出p, q最靠近的公共祖先節點。 題目的原文敘述 測試範例 Example 1: Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
五濁惡世的生存是混頓一團,人心早將天、地、人、鬼、神、佛各種不同角色難以來作分別,故! 該禮敬的不懂得恭敬, 該遠離的沒保持距離, 該學習的沒有真誠心, 該放下的卻緊抓不放, 該看破的還流連忘返。 是故!執著、分別、妄想黏近在身,難以擺脫。人之最終;都是要面對(一時),要知道:棺材中裝的是死人並非老
搞不好有些人見到我的新增文章內容,就想說,就只做日間文書?刺激不夠! 其實,我今天才第一天! 目前也只有每週三的〝領物品〞、早上送護理師制服和交換文件而已,根本沒有必要〝揠苗助長〞,不是嗎? 代理義工期間:增加運動量和耐力 對自閉症者而言,真的需要的是機會。 而這機會,不只是訓練的機會,也有發揮所長
美國參議院議長裴洛西於2022年8月2日訪問台灣,巧合同一天至15日中共高層都沒有現身任何公開場合與活動,所有解讀,高度共識應該都在北戴河開會。 但今年因為有習近平接任第三任期,有中美衝突升高,因此讓北戴河會議充滿政治味。
Thumbnail
當你看到這篇文章時,表示我還未寫完下一篇影評文章,而我又不想開空窗。
Thumbnail
黑暗不會滅絕,拚命守護自己的小天地
寒假開始後,除了例行的排練之外,江楚桓就沒怎麼和程皓碰過面。傳訊息給他也總是幾句敷衍的回覆便沒了下文,打電話嘛......其實也沒什麼要緊事,不知道說什麼好。 而且程皓不喜歡通電話或語音,他倆要嘛直接見面,要嘛通訊軟體聊個幾句。 好吧,仔細想想本來就是這種互動模式,但江楚桓總覺得哪裡不對勁。 自從目
休業式的下午到處都是學生,街上好不熱鬧。有些趕著補習、家教,有些忙著社團或校隊練習。只有程皓獨自逆著人流晃悠著,瀏覽過每個櫥窗。 他家樓下的假面夫妻在女兒自殺未遂後悄然搬離。社區裡的婆婆媽媽都還在拿那場意外當飯後談資呢,待發現時新住戶早已整頓好,住進去不知幾個禮拜了。 程皓罕見地翹掉了補習,隨意溜達
她趴臥在冰冷磁磚地上,有隻蛾子的屍體粘在紗窗外無措地隨風搖曳,像學校裡任人踐踏的落葉,那麼地無足輕重。 今天自習課時她讀了一本自費出版的奇幻小說,叫做「重生始於終結」。據悉,作者已經離開了,全然不在乎作品的評價或收益,自由地來自由地去。 將書賣給她的那位年輕店主見過作者一面,說了作者希望只把故事告訴
怎樣的人生才算是幸福快樂的? 擁有亮眼的學歷以及值得驕傲的工作和薪水,還是門當戶對的嫁娶與兒女雙全的婚姻? 或者缺一不可,以上條件都必須被滿足? 人生真的是困難,像是一場嚴苛的大考。誰都爭著想要那張寫著「成功」的標籤,誰都以為爭贏了一輩子就能過得快活。 殊不知並非人人都有足夠的運氣成為魚與熊掌的兼得
Thumbnail
故事從一場葬禮開始。 高中時期,許多電影小說裡描述的那個燦爛的花季,他們本該青春,卻因現實帶著不合時宜的滄桑。 難以抑制的一次心動以及不可避免的一場誤會,在年少的三人之間刻下了無法回溯的一道傷痛。從今往後他們各自苟延殘喘,在社會的縫隙掙扎只為生存。直到命運又將毫無意義的他們聚首⋯⋯
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
五濁惡世的生存是混頓一團,人心早將天、地、人、鬼、神、佛各種不同角色難以來作分別,故! 該禮敬的不懂得恭敬, 該遠離的沒保持距離, 該學習的沒有真誠心, 該放下的卻緊抓不放, 該看破的還流連忘返。 是故!執著、分別、妄想黏近在身,難以擺脫。人之最終;都是要面對(一時),要知道:棺材中裝的是死人並非老
搞不好有些人見到我的新增文章內容,就想說,就只做日間文書?刺激不夠! 其實,我今天才第一天! 目前也只有每週三的〝領物品〞、早上送護理師制服和交換文件而已,根本沒有必要〝揠苗助長〞,不是嗎? 代理義工期間:增加運動量和耐力 對自閉症者而言,真的需要的是機會。 而這機會,不只是訓練的機會,也有發揮所長
美國參議院議長裴洛西於2022年8月2日訪問台灣,巧合同一天至15日中共高層都沒有現身任何公開場合與活動,所有解讀,高度共識應該都在北戴河開會。 但今年因為有習近平接任第三任期,有中美衝突升高,因此讓北戴河會議充滿政治味。
Thumbnail
當你看到這篇文章時,表示我還未寫完下一篇影評文章,而我又不想開空窗。
Thumbnail
黑暗不會滅絕,拚命守護自己的小天地
寒假開始後,除了例行的排練之外,江楚桓就沒怎麼和程皓碰過面。傳訊息給他也總是幾句敷衍的回覆便沒了下文,打電話嘛......其實也沒什麼要緊事,不知道說什麼好。 而且程皓不喜歡通電話或語音,他倆要嘛直接見面,要嘛通訊軟體聊個幾句。 好吧,仔細想想本來就是這種互動模式,但江楚桓總覺得哪裡不對勁。 自從目
休業式的下午到處都是學生,街上好不熱鬧。有些趕著補習、家教,有些忙著社團或校隊練習。只有程皓獨自逆著人流晃悠著,瀏覽過每個櫥窗。 他家樓下的假面夫妻在女兒自殺未遂後悄然搬離。社區裡的婆婆媽媽都還在拿那場意外當飯後談資呢,待發現時新住戶早已整頓好,住進去不知幾個禮拜了。 程皓罕見地翹掉了補習,隨意溜達
她趴臥在冰冷磁磚地上,有隻蛾子的屍體粘在紗窗外無措地隨風搖曳,像學校裡任人踐踏的落葉,那麼地無足輕重。 今天自習課時她讀了一本自費出版的奇幻小說,叫做「重生始於終結」。據悉,作者已經離開了,全然不在乎作品的評價或收益,自由地來自由地去。 將書賣給她的那位年輕店主見過作者一面,說了作者希望只把故事告訴
怎樣的人生才算是幸福快樂的? 擁有亮眼的學歷以及值得驕傲的工作和薪水,還是門當戶對的嫁娶與兒女雙全的婚姻? 或者缺一不可,以上條件都必須被滿足? 人生真的是困難,像是一場嚴苛的大考。誰都爭著想要那張寫著「成功」的標籤,誰都以為爭贏了一輩子就能過得快活。 殊不知並非人人都有足夠的運氣成為魚與熊掌的兼得
Thumbnail
故事從一場葬禮開始。 高中時期,許多電影小說裡描述的那個燦爛的花季,他們本該青春,卻因現實帶著不合時宜的滄桑。 難以抑制的一次心動以及不可避免的一場誤會,在年少的三人之間刻下了無法回溯的一道傷痛。從今往後他們各自苟延殘喘,在社會的縫隙掙扎只為生存。直到命運又將毫無意義的他們聚首⋯⋯