kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

ジェネレータ(続き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