ジェネレータ(続き4)
そうかー木もこうやってジェネレータにできるんだーと思いましたとさ
確かどこかでそういうのやりたかったけどあきらめた気がする
見つけ出してリベンジしたい
たぶんこのへんで思ったのかな(記憶なし
今度は二分木を作ったあと、Preorder、Inorder、Postorderで 巡回してみるっていう問題
ALDS1_7_C: Tree Walk - kb84tkhrのブログ
もっと進んで二分探索木のところだったかもしれない
そのときのコードを書き直すのはやめてあらためて書き直す
class Node:
def __init__(self, val, left=[], right=[]):
self.val = val
self.left = left
self.right = right
def __iter__(self):
yield from self.inorder()
def preorder(self):
yield self
yield from self.left
yield from self.right
def inorder(self):
yield from self.left
yield self
yield from self.right
def postorder(self):
yield from self.left
yield from self.right
yield self
tree = Node(5, Node(3, Node(1), []), Node(6, [], Node(7)))
print("inorder:", [node.val for node in tree]) # inorder
print("preorder:", [node.val for node in tree.preorder()])
print("postorder:", [node.val for node in tree.postorder()])
たいへん気持ちよく書けました
なお終端を表すのにNone
ではなく[]
を使っているのは
None
のチェックをなくすためです
None
を使った場合は
if self.left: yield from self.left
といったチェックが必要ですが
[]
であればそのままyield from
に渡してもエラーになりません
yield from []
は何もしないので、スルーされて次のyieldまで進みます
邪道かもしれませんが
さて実行
$ tree-generator.py
[1, 3, 5, 6, 7]
[5, 1, 3, 6, 7]
[1, 3, 6, 7, 5]
OK