
こんにちは
今回の学びは
・lcaは暗記レベルで。
問題はlowest-common-ancestor-of-a-binary-tree
(時間配分は5分問題理解=restate&clarify 10分検討multip-sol, analysis, reasons 10分実装 20分振り返り の一文45分構成)をできればgoogle docで笑&真剣。
終始、わからないことは声にだして、明確にしていきましょう。
1,まずは入出力をしっかりおさえましょう。(問題を自分の言葉で復唱すること、わからないことをクリアにすると、前提も声にだすこと)
Q:ノードのvalはduplicateする?
Q:同じノードがp,qだったら?
2,いくつかのソリューションを声にだして出してみましょう。(もちろんtime complexit, space complexityの分析や理由を付け加えて)
3,どれでいくか、一緒に決定しましょう。(理由付きでね、よろしく)
timespace analysis (時間とスペースの分析)は 〇〇です
O(N)とsO(N)で。
preoderのdfsでいくと、かならずleftとrightからの返却があって、そこで判断します。
dfsはnodeがp,qだったらtrue返す、という単純なもの
最初はグローバル変数で。
4、実装しましょう。
class Solution:
def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q:TreeNode) -> TreeNode:
lca = [None]
def dfs(node, p, q):
# looking for p OR q
if node:
ret_m = node.val == p.val or node.val == q.val
ret_l = dfs(node.left, p, q)
ret_r = dfs(node.right, p, q)
if (ret_l and ret_r) or (ret_m and ret_l) or (ret_m and ret_r):
if lca[0] is None:
lca[0] = node
return True
return any([ret_m, ret_l, ret_r])
return False
ans = dfs(root, p, q)
return lca[0] if lca[0] else root
5、エッジケースとサンプルテストを忘れずに!
グローバル変数を使っている点と、見つかった時点で終了する
という工夫を追加したいです。
グローバル変数をつかわずにもっと単純化できます。
のような感じです。
class Solution:
def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q:TreeNode) -> TreeNode:
def dfs(node, p, q):# looking for p OR q
if not node or node == p or node == q:
return node
left = dfs(node.left, p, q)
right = dfs(node.right, p, q)
if left and right: return node
return left if left else right
return dfs(root, p, q)
振り返り
「次のこの問題を解くばあい知っていればよい一つの事実とは?」
lcaは暗記レベルで。
まとめ
・lcaは暗記レベルで。
以上です