圖論應用: 奇偶二元樹 Even Odd Tree_Leetcode #1609

更新於 2024/02/29閱讀時間約 7 分鐘

題目敘述

題目會給定一棵二元樹的根結點,要求我們判定這是否為一顆合法的奇偶二元樹?

奇偶二元樹的定義:
從上到下依序是第0層、第一層、...、第n層
偶數層裡面的節點值都必須是奇數,而且由左到右嚴格遞增
奇數層裡面的節點值都必須是偶數,而且由左到右嚴格遞減

題目的原文敘述


測試範例

Example 1:

raw-image
Input: root = [1,10,4,3,null,7,9,12,8,6,null,null,2]
Output: true
Explanation: The node values on each level are:
Level 0: [1]
Level 1: [10,4]
Level 2: [3,7,9]
Level 3: [12,8,6,2]
Since levels 0 and 2 are all odd and increasing and levels 1 and 3 are all even and decreasing, the tree is Even-Odd.

Example 2:

raw-image
Input: root = [5,4,2,3,3,7]
Output: false
Explanation: The node values on each level are:
Level 0: [5]
Level 1: [4,2]
Level 2: [3,3,7]
Node values in level 2 must be in strictly increasing order, so the tree is not Even-Odd.

Example 3:

raw-image
Input: root = [5,9,1,3,5,7]
Output: false
Explanation: Node values in the level 1 should be even integers.

約束條件

Constraints:

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

節點總數量介於1~十萬之間。

  • 1 <= Node.val <= 10^6

每個節點值的範圍落在1~一百萬之間。


演算法 BFS (Level-order traversal)

由奇偶二元樹的定義可以知道,規則是依賴當下層數的奇偶來決定。

因此,最適合的選擇就是BFS廣度優先搜索,先天具有逐層由上到下拜訪的特質

並且在每一層拜訪的時候,加上對應的偶數、奇數判斷,和遞增、遞減判斷即可。


奇偶二元樹的定義:
從上到下依序是第0層、第一層、...、第n層
偶數層裡面的節點值都必須是奇數,而且由左到右嚴格遞增
奇數層裡面的節點值都必須是偶數,而且由左到右嚴格遞減

程式碼 BFS (Level-order traversal)

class Solution:
def isEvenOddTree(self, root: TreeNode) -> bool:

queue = [(root)] if root else []

is_odd = lambda x: (x % 2 == 1)
is_even = lambda x: (x % 2 == 0)

level = 0

while queue:

next_queue = []
prev_value = None

even_level = True if is_even(level) else False

for idx, node in enumerate(queue):

# check for value of even/odd property
if even_level and not is_odd(node.val):
return False

if not even_level and not is_even(node.val):
return False

# check for monotone increasing/decreasing
if idx == 0:
# left-most node
prev_value = float('-inf') if is_even(level) else float('inf')

else:
# non left-most node

if is_even(level) and prev_value >= node.val:
return False

elif is_odd(level) and prev_value <= node.val:
return False

# update current node value as previous value
prev_value = node.val

# append children node if they exist
if node.left:
next_queue.append(node.left)

if node.right:
next_queue.append(node.right)

# update queue and level for next level traversal
queue = next_queue
level += 1

return True

複雜度分析

時間複雜度:

BFS廣度優先拜訪整棵樹,每個節點至多拜訪一次。所需時間為O(n)

空間複雜度:

BFS quque所需成本為O(n),最大成本落在最後一層。


關鍵知識點

由奇偶二元樹的定義可以知道,規則是依賴當下層數的奇偶來決定。

因此,最適合的選擇就是BFS廣度優先搜索,先天具有逐層由上到下拜訪的特質


Reference:

[1] Even Odd Tree - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 題目會給定一棵二元樹的根結點,要求我們找出這棵二元樹最後一層最左邊的值。 題目的原文敘述 測試範例 Example 1: Input: root = [2,1,3] Output: 1 Example 2: Input: root = [1,2,3,4,null,5,6
題目敘述 題目會給定一個二維陣列grid,代表每顆橘子分布的位置和初始狀態。 0: 這個格子點沒有東西。 1: 這個格子點有一顆新鮮的橘子。 2: 這個格子點有一顆壞掉的橘子。 壞掉的橘子上面的黴菌, 每隔一個週期,可以向上、下、左、右 N4四連通的格子點感染一次。 請問,最少需要多
題目敘述 題目會給定一個參數n代表人口總數,和對應的信任關係陣列trust,陣列元素都是pair都以,[a, b]的形式呈現,代表a信任b。 要求我們找出法官是誰,返回法官的ID? 成為法官的條件: 1.每個人(除了法官自己之外)都信任法官。 2.法官不信任別人。 題目的原文敘述
題目敘述 題目會給我們一個參數k 和 目標值n。 請問我們從1~9內挑k個相異的數字,使得他們的總和為n 的組合數有多少? 挑選時,每個數字必須相異,而且每個數字只能選一次。 題目的原文敘述 測試範例 Example 1: Input: k = 3, n = 7 Output: [
題目敘述 題目會給我們一個傳統手機的數字鍵盤 和一個數字鍵的輸入字串digits,要求我們列舉出所有輸入字串digits可能對應到的英文字母的排列。 例如輸入digits="23" 那對應到的英文字母排列就是"ad", "ae", "af", "bd", "be", "bf", "cd", "
題目敘述 題目會給我們一個4位數字的數字鎖,還有解鎖的密碼target,和陷阱數字deadends(假如遇到的會鎖會直接卡住,不能在撥動轉盤了)。 預設開始的狀態是0000,請問,最少要撥動轉盤幾次才能解鎖? 題目的原文敘述 測試範例 Example 1: Input: deaden
題目敘述 題目會給定一棵二元樹的根結點,要求我們找出這棵二元樹最後一層最左邊的值。 題目的原文敘述 測試範例 Example 1: Input: root = [2,1,3] Output: 1 Example 2: Input: root = [1,2,3,4,null,5,6
題目敘述 題目會給定一個二維陣列grid,代表每顆橘子分布的位置和初始狀態。 0: 這個格子點沒有東西。 1: 這個格子點有一顆新鮮的橘子。 2: 這個格子點有一顆壞掉的橘子。 壞掉的橘子上面的黴菌, 每隔一個週期,可以向上、下、左、右 N4四連通的格子點感染一次。 請問,最少需要多
題目敘述 題目會給定一個參數n代表人口總數,和對應的信任關係陣列trust,陣列元素都是pair都以,[a, b]的形式呈現,代表a信任b。 要求我們找出法官是誰,返回法官的ID? 成為法官的條件: 1.每個人(除了法官自己之外)都信任法官。 2.法官不信任別人。 題目的原文敘述
題目敘述 題目會給我們一個參數k 和 目標值n。 請問我們從1~9內挑k個相異的數字,使得他們的總和為n 的組合數有多少? 挑選時,每個數字必須相異,而且每個數字只能選一次。 題目的原文敘述 測試範例 Example 1: Input: k = 3, n = 7 Output: [
題目敘述 題目會給我們一個傳統手機的數字鍵盤 和一個數字鍵的輸入字串digits,要求我們列舉出所有輸入字串digits可能對應到的英文字母的排列。 例如輸入digits="23" 那對應到的英文字母排列就是"ad", "ae", "af", "bd", "be", "bf", "cd", "
題目敘述 題目會給我們一個4位數字的數字鎖,還有解鎖的密碼target,和陷阱數字deadends(假如遇到的會鎖會直接卡住,不能在撥動轉盤了)。 預設開始的狀態是0000,請問,最少要撥動轉盤幾次才能解鎖? 題目的原文敘述 測試範例 Example 1: Input: deaden
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
上篇進一步認識基本的圖形架構與三大 Graph 算法,那首先從 shortest path 開始,我們會陸續去理解這些算法,以及可能的應用,如果還沒有看過上一篇的,可以點以下連結~那我們就開始吧! 【圖論Graph】Part1:初探圖形與圖形演算法之應用
Thumbnail
本篇文章深入介紹了圖形的基本概念、組成和應用。從圖形的基本組成,到圖的類型與種類,再到圖形演算法的三大類型,本文將接續圖形領域的深入學習,並分享了對圖形的初步認識和學習方向的小心得。希望對正在學習圖形的人有所幫助。
Thumbnail
圖形演算法在資料處理上扮演重要角色。本文介紹圖形的歷史、定義、技術用途,以及為什麼我們要關心圖形演算法。文末還提及圖形演算法在機器學習領域的應用。下次將介紹更詳細的圖形演算法內容。
Thumbnail
  回想起剛從機械系畢業時,我懂得怎麼計算,也熟悉各種機械理論。但真正要自己設計時,卻只能朦朧應用,可以說是亂兜各種機件,最後拼出了一個四不像的奇怪機構。   而十年後的現在,對機構學的熱情讓我始終從事「能應用『動力機構』」的工作。看過許多機械構造也自己鑽研許多,才能達到現在類「得心應手」的地步。
Thumbnail
因最近看到又有人討論起推背圖後,我不禁回想去過去台灣這邊也是拿推背圖來說誰當選。 所以整理一下過去對於推背圖的一些瞭解,重新解剖一下解讀的走向。 首先要先弄清楚推背圖的規律,我整頓完思緒後基本上可以歸納幾點。 1.此預言是描述[中國大陸的最大勢力],所以如今的現在,描述的只會是[中共國],而非[中華
Thumbnail
-> 這篇在說什麼 這篇文章提供一個科目圖的視角來分析科系,每個學生可以依照自己喜歡的工作,來反推出需要學習的科目,進而反推出選這科系的成本效益值 此篇也會leverage這科目圖工具去解除一些大家的誤解/盲點 出路廣的科系就是好科系? 是否有盲點? 出路廣的科系還有分類? 前言 如何判斷?
哈耶克這種人之所以能在漢語圈傳播得很遠,有一點就是因為他的行為模式很像是胡適那種士大夫,這種人就非常精確地體現了胡適所謂的那種「對政治不感興趣的興趣」。所謂「不感興趣的興趣」,從最難聽的方向進行惡意解釋,恰好就是鮑德溫用來罵羅瑟米爾爵士的那句話:他們追求不負責任的權力,正如歷代的婊子追求牌坊。
Thumbnail
 最近接觸一位熱愛八九十年代流行歌曲的小學生,他在言談間也不時哼起一兩句,使我不期然想起小時候的自己。  香江小故事 「I, I, I was born in Beijing,不知命運是誰定。」黎天
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
上篇進一步認識基本的圖形架構與三大 Graph 算法,那首先從 shortest path 開始,我們會陸續去理解這些算法,以及可能的應用,如果還沒有看過上一篇的,可以點以下連結~那我們就開始吧! 【圖論Graph】Part1:初探圖形與圖形演算法之應用
Thumbnail
本篇文章深入介紹了圖形的基本概念、組成和應用。從圖形的基本組成,到圖的類型與種類,再到圖形演算法的三大類型,本文將接續圖形領域的深入學習,並分享了對圖形的初步認識和學習方向的小心得。希望對正在學習圖形的人有所幫助。
Thumbnail
圖形演算法在資料處理上扮演重要角色。本文介紹圖形的歷史、定義、技術用途,以及為什麼我們要關心圖形演算法。文末還提及圖形演算法在機器學習領域的應用。下次將介紹更詳細的圖形演算法內容。
Thumbnail
  回想起剛從機械系畢業時,我懂得怎麼計算,也熟悉各種機械理論。但真正要自己設計時,卻只能朦朧應用,可以說是亂兜各種機件,最後拼出了一個四不像的奇怪機構。   而十年後的現在,對機構學的熱情讓我始終從事「能應用『動力機構』」的工作。看過許多機械構造也自己鑽研許多,才能達到現在類「得心應手」的地步。
Thumbnail
因最近看到又有人討論起推背圖後,我不禁回想去過去台灣這邊也是拿推背圖來說誰當選。 所以整理一下過去對於推背圖的一些瞭解,重新解剖一下解讀的走向。 首先要先弄清楚推背圖的規律,我整頓完思緒後基本上可以歸納幾點。 1.此預言是描述[中國大陸的最大勢力],所以如今的現在,描述的只會是[中共國],而非[中華
Thumbnail
-> 這篇在說什麼 這篇文章提供一個科目圖的視角來分析科系,每個學生可以依照自己喜歡的工作,來反推出需要學習的科目,進而反推出選這科系的成本效益值 此篇也會leverage這科目圖工具去解除一些大家的誤解/盲點 出路廣的科系就是好科系? 是否有盲點? 出路廣的科系還有分類? 前言 如何判斷?
哈耶克這種人之所以能在漢語圈傳播得很遠,有一點就是因為他的行為模式很像是胡適那種士大夫,這種人就非常精確地體現了胡適所謂的那種「對政治不感興趣的興趣」。所謂「不感興趣的興趣」,從最難聽的方向進行惡意解釋,恰好就是鮑德溫用來罵羅瑟米爾爵士的那句話:他們追求不負責任的權力,正如歷代的婊子追求牌坊。
Thumbnail
 最近接觸一位熱愛八九十年代流行歌曲的小學生,他在言談間也不時哼起一兩句,使我不期然想起小時候的自己。  香江小故事 「I, I, I was born in Beijing,不知命運是誰定。」黎天