こんにちは
今回の学びは
・木は締めトリック右と左が同じか?左の右と右の左が同じか?の分割統治法で(再起でも)倒せる
問題はhttps://leetcode.com/problems/symmetric-tree/
(時間配分は5分問題理解 10分検討 10分実装 20分振り返り の一文45分構成)
終始、わからないことは声にだして、明確にしていきましょう。
1,まずは入出力をしっかりおさえましょう。(問題を自分の言葉で復唱すること、わからないことをクリアにすると)
nullがあたえられたらどうする?=> trueでいいか。
2,いくつかのソリューションを声にだして出してみましょう。(もちろんtime complexit, space complexityの分析を付け加えて)
1つは、levelorderを配列に格納して、それをvalidateする。O(N)解法。
2つは、dfs()でもハッシュマップで自分のlayer層と何番目の子供か?という情報があればなんとかトラックできるとおもうが、worstケースの計算が悪いので、
3,どれでいくか、一緒に決定しましょう。
1つめの解法でいく。
4、実装しましょう。
class Solution:
def validate(self, layer: List[int]):
#print("layer:%s" % layer)
if layer is None or len(layer) == 0: True
l = 0
r = len(layer) - 1
while l <= r:
#print("layer[l]:%s != layer[r]:%s" % (layer[l], layer[r]))
if layer[l] != layer[r]: return False
l += 1
r -= 1
return True
def isSymmetric(self, root: TreeNode) -> bool:
if root is None: return True
stack = [root]
while len(stack) > 0:
layer_stack = []
layer = [n.val if n else 'null' for n in stack]
# validate layer
if not self.validate(layer): return False
for n in stack:
if n:
layer_stack += [n.left, n.right]
stack = layer_stack
return True
5、エッジケースとサンプルテストを忘れずに!
サンプルケースで声にだして、しゃべってみた。
エッジケースはnullくらい。
振り返り
「次のこの問題を解くばあい知っていればよい一つの事実とは?」
level-orderでのtraverseが基本。
(これで詰まるならここで復習せよ。【アルゴリズム脳トレ】leetcode medium 429 N-ary tree inorder traversal)
他の人の解法紹介。
再起の解法はhttps://leetcode.com/problems/symmetric-tree/discuss/460626/Python-Code%3A-Faster-than-99
考え方は、木は締めトリック右と左が同じか?左の右と右の左が同じか?の分割統治法で倒せる
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
def rec(node1, node2):
if node1 is None and node2 is None: return True
if node1 is None and node2: return False
if node1 and node2 is None: return False
# どっちもノード有り
if node1.val != node2.val: return False
# ここは味噌。n1の左と右を比較している訳ではないことに注意!
return rec(node1.left, node2.right) and rec(node1.right, node2.left)
if root is None: return True
return rec(root.left, root.right)
(explained https://leetcode.com/problems/symmetric-tree/discuss/461798/Python-Iterative-and-Recursive-solution)
関連問題。

まとめ
木は締めトリック右と左が同じか?左の右と右の左が同じか?の分割統治法で(再起でも)倒せる
以上です