計算二元樹中的好節點數
“計算二元樹中的好節點”問題的詳細指南和 Python 實作。
1. 學習
「計算二元樹中的好節點」問題是樹部分的關鍵挑戰。
此實作重點在於 Python 中的中階邏輯。
在我們提供的解決方案中,我們優先考慮技術準確性和程式碼可讀性。
2. Real-World Applications
3. Visual Intuition
可視化計算二元樹中好節點的邏輯流程。
4. Prerequisites
5. Step-by-Step Thinking
1. Understand the problem
仔細閱讀「計算二元樹中的好節點數」的問題陳述。
2. Formulate brute force
起草一個簡單的迭代解決方案。
3. Identify inefficiency
尋找冗餘計算。
4. Optimize search path
使用散列或排序來加速該過程。
5. Final Implementation
清理生產標準代碼。
問題陳述
給定一個二元樹根,如果從根到 X 的路徑中不存在值大於 X 的節點,則樹中的節點 X 被命名為良好。
傳回二元樹中好節點的數量。
該樹被表示為一個級別順序列表。實作函數 goodNodes(root: list) -> int。
- •The number of nodes in the binary tree is in the range [1, 100000]
- •-10000 <= Node.val <= 10000
範例
[3,1,4,3,None,1,5]
4
Root 3 is always good. Node 4 (3<=4, good). Node 3 under node 1 (3<=3, good). Node 5 (3<=4<=5, good). Node 1 is not good (3>1). Node 1 under 4 is not good (4>1). Total: 4 good nodes.
[3,3,None,4,2]
3
Root 3 is good. Node 3 (left child, 3<=3, good). Node 4 (3<=3<=4, good). Node 2 is not good (3>2). Total: 3.
[1]
1
The root is always a good node.
Need a Hint?
Edge Cases to Watch
- 空輸入結構
- 單元素輸入
- 大數值範圍
準備好解決了嗎?
Open the problem in PyRun's browser-based Python editor. Your code runs fully offline — no server required.
面試見解和變化
複雜度分析分解
為什麼時間: Directly evaluates all possibilities.
為什麼選擇太空: Uses standard local memory.
為什麼時間: Optimized paths reduce total operations.
為什麼選擇太空: May trade memory for speed.
最佳化解決方案Python程式碼
最佳化解決方案Python程式碼
def good_nodes_opt(root):
if isinstance(root, list):
r = build_tree(root)
return good_nodes_opt_helper(r)
return good_nodes_opt_helper(root)
def good_nodes_opt_helper(root: TreeNode) -> int:
def dfs(node, max_val):
if not node:
return 0
res = 1 if node.val >= max_val else 0
max_val = max(max_val, node.val)
res += dfs(node.left, max_val)
res += dfs(node.right, max_val)
return res
return dfs(root, float('-inf'))暴力破解代碼(劇透保護)
暴力破解代碼(劇透保護)
def good_nodes_brute(root):
if isinstance(root, list):
r = build_tree(root)
return good_nodes_brute_helper(r)
return good_nodes_brute_helper(root)
def good_nodes_brute_helper(root: TreeNode) -> int:
def dfs(node, path):
if not node: return 0
is_good = 1 if all(x <= node.val for x in path) else 0
path.append(node.val)
left = dfs(node.left, path)
right = dfs(node.right, path)
path.pop()
return is_good + left + right
return dfs(root, [])Algorithm Pattern Checklist
When dealing with Trees data patterns.
- Are constraints clear?
- Is there a linear or logarithmic optimization possible?
PyRun is built and maintained by an independent solo developer. If this helped your interview prep, consider buying a coffee!
推薦的 Python 資源
透過相關的互動式教學、備忘單和程式碼比較來擴展您的知識。
Python 嘗試/例外與錯誤處理
防止 Python 腳本崩潰。了解 try、 except、finally 區塊以及如何正確引發自訂異常。
如何在 Python 中反轉字串
透過視覺化程式碼範例了解如何使用切片、reversed() 函數和循環串聯在 Python 中反轉字串。
Python 字串方法備忘單
Python 字串操作的完整參考指南。掌握格式化、搜尋、拆分、取代和檢查字串屬性。
Python 與 JavaScript:哪種程式語言最好?
Python 和 JavaScript 的全面比較。探索語法差異、效能、用例(後端與前端)和編碼範例。