跳到主要內容

精選文章

Kotlin 學習: Leetcode AND-OR 樹 相關題目.

 先前在用 Grok build 寫 電腦解死活題程式時,

     圍棋 電腦解死活題研究 tsumego

燒掉了我三週的周用量不說, 還沒寫對, 而且遇到去年 GPT4 時代鬼打牆的問題;

看來這種還需要研究的課題, 直接讓 AI 寫程式的話, AI 可能會東參考西參考, 有些還沒定論的會錯亂... 想想還是我自己來看看怎麼寫, 引導 AI 來做比較好;

討論中, AI 似乎是用 AND-OR 樹架構來解?於是興起自己先透過 leetcode 學 AND-OR tree 的念頭; 


目前做了兩個


KOTLIN 學習 : LEETCODE Easy 2331. Evaluate Boolean Binary Tree

KOTLIN 學習 : LEETCODE Hard 1106. Parsing A Boolean Expression


今天 1106 hard 的這題解完後, 有些感觸和成就感^^

先來記錄一下^^

AI 做雖然快, 但解問題時 自身學習到的分析思考組織重組實現, 和完成時的成就感,

這些都是用 AI 時無法獲得的..  


不過 Grok AI 也有提到, AND-OR 樹 AND 看到 0 就停, OR 看到 1 就停的短路求值方式, 

目前在 Leetcode 上還沒有相對合適的題目體現?


繼續研究... 



=== Grok AI 建議的 Leetcode AND-OR tree 相關題目 ===


LeetCode 沒有題目標明「AND-OR 樹 / AO* / 問題化簡」。最接近、結構上就是 AND-OR 樹的,是「葉子為真假、內部節點為 AND/OR」的布林表達式樹。其餘多半只是概念親戚。


一、結構上就是 AND-OR 樹(最直接)

這幾題的輸入本身就是:葉 = 原子命題,內節點 = () / ()(有的再加 ()、XOR)。求值規則也和 AND-OR 一樣:AND 要兩邊都真,OR 一邊為真即可。

題號 題名 難度 和 AND-OR 的對應 備註
2331 Evaluate Boolean Binary Tree Easy 給一棵滿二叉樹:葉 0/1,內點 2=OR3=AND,求根的值 最像教科書 AND-OR 求值;後序遍歷即可
2313 Minimum Flips in Binary Tree to Get Result Hard 🔒 同上,再加 XOR、NOT;最少翻幾個葉,讓根變成指定真假 樹形 DP:每個子樹算「變成 true / false 的最小代價」。AND 要兩邊都真、OR 至少一邊真,就是解子樹的代價版
1106 Parsing A Boolean Expression Hard 字串 &(…)|(…)!(…)n 元 AND-OR 樹 的前綴寫法 先還原成樹再求值,或用棧模擬
1896 Minimum Cost to Change the Final Value of Expression Hard 0/1&/| 組成的表達式樹;可改葉或改運算符,使根值翻轉,求最少操作 隱式建樹 + 每個子表達式維護「當前值、翻轉代價」

刷題順序建議:2331 → 1106 → 2313 → 1896
2331 只問「這棵 AND-OR 樹的值」;後面三題是「在同一種樹上做最小修改」,比較像把 AO* 的「解圖代價」縮成布林特例。


二、是表達式樹,但運算符不是 AND/OR(不要算直接相關)

這些是「表達式樹」家族,內部是 + - * /,不是邏輯 AND-OR:

  • 1628 Design an Expression Tree With Evaluate Function 🔒
  • 1597 Build Binary Expression Tree From Infix Expression 🔒
  • 1612 Check If Two Expression Trees are Equivalent 🔒

練習建樹、求值很有用,但語意是算術,不是「全部子目標/任選一條」。

同樣不要和 AND-OR 搞混:

  • 558 Quad-Tree 上的格子 OR
  • 1318 整數位元 OR
  • 樹上路徑的 bitwise AND/OR

那是位元運算,不是目標分解樹。


三、概念對應:博弈樹 = 特殊 AND-OR(Minimax)

AI 裡常把 MAX 當 OR(己方選一步即可)、MIN 當 AND(必須應付對手所有回覆)。LeetCode 的零和博弈 DP 就是在這棵隱式樹上求值,題面不會寫 AND-OR

較典型:

若要練「OR = 存在一個必勝著、AND = 所有回覆都能接」,這組比布林樹更接近博弈版 AND-OR;但沒有 AO*、也沒有明確的 AND 弧。


四、LeetCode 沒有、理論課才有的那題

課程裡常見的 AND-OR 樹短路求值(AND 看到 0、OR 看到 1 就停;隨機先探哪一邊,期望讀葉 (O(n^{0.792})))沒有對應 LeetCode 題
2331 若把語言的 && / || 短路用上,只是實作細節,不是這道複雜度題。

也沒有:AO*、解子圖、非確定環境條件計劃、圖模型 AND/OR search。那些不會以 LeetCode 形式出現。


五、若目標是「用刷題把 AND-OR 練熟」

只練直接相關的四題就夠:

  1. 2331:會走樹、會套 AND/OR 語意。
  2. 1106:從字串還原 n 元 AND-OR,並處理 NOT。
  3. 2313:每個子樹回傳「到 true / 到 false 的代價」——這已經是解圖代價的布林版。
  4. 1896:先解析再 DP,規模到 (10^5),逼你把「改葉 vs 改連接子(&↔︎|)」想清楚。

要對口試講一句:
LeetCode 上的 AND-OR 是 布林表達式樹的求值與最小修改,不是 AI 教科書裡的問題化簡搜尋。

留言

熱門文章