こんにちは
今回の学びは
・iterativeはスタックを使って、うまく取り出すのよ。
問題はn-ary-tree-preorder-traversal
(時間配分は5分問題理解 10分検討 10分実装 20分振り返り の一文45分構成)
まずは入出力をしっかりおさえましょう。
実装前後でこれは毎回書きましょう。timespace analysis (時間とスペースの分析)は
問題の理解がしにくいと感じましたが、pre-orderの問題です。
実際の実装はこちら
class Solution_rec:
def __init__(self):
self.order = []
def rec(self, root) -> List[int]:
if root is None: return
self.order.append(root.val)
for child_node in root.children:
self.preorder(child_node)
def preorder(self, root) -> List[int]:
self.rec(root)
return self.order
フォローアップ問題は難しかったです
まずは簡単な木の操作の復習が必要でした。こちらでやりました。
二分木のpre-order, in-order, post-orderの簡単でわかりやすい説明
その後とけました。
class Solution:
def preorder(self, root) -> List[int]:
stack, order = [], []
curr = root
i = 0
while curr or len(stack) > 0:
i = 0
if curr: #ポインタがあるとき
# do something
order.append(curr.val)
stack.append((curr, i)) # 現在ノードiは終わったよ(終わるつもり)。次はi+1してね。という意味
if len(curr.children) > i:
curr = curr.children[i] # 左にすすめ
else:
curr = None
i = 0
else: #stackがあるので
curr, i = stack.pop()
i = i + 1 # I want do next one!
# do something
#curr = curr.right # 右にすすめ
if len(curr.children) > i:
stack.append((curr, i))
curr = curr.children[i] # 左にすすめ
else:
curr = None
i = 0
return order
「次のこの問題を解くばあい知っていればよい一つの事実とは?」
iterativeはスタックを使って、うまく取り出すのよ。
復習はこちら---> ( 二分木のpre-order, in-order, post-orderの簡単でわかりやすい説明 )
まとめ
・iterativeはスタックを使って、うまく取り出すのよ。
以上です