Binary Search Tree Iterator II: LeetCodeの問題解説と効率的な解法


この問題の目的は、バイナリサーチツリー内の要素を昇順で反復処理するイテレータを実装することです。ただし、この問題では、イテレータが削除操作にも対応できるようにする必要があります。つまり、イテレータを使用して要素を取り出した後、その要素をバイナリサーチツリーから削除することができます。

解法のアイデアは比較的シンプルです。まず、バイナリサーチツリーの要素を格納するためのスタックを用意します。スタックには、バイナリサーチツリーを左から順にたどりながら、ノードをスタックに積みます。このようにすることで、スタックのトップには現在の最小要素が常に存在するようになります。

次に、イテレータが要素を取り出すたびに、スタックのトップから要素を取り出し、その要素を返します。そして、もし取り出した要素が子ノードを持っている場合は、その子ノードをたどりながら、スタックにノードを追加していきます。このようにすることで、スタックのトップには常に次の最小要素が存在するようになります。

また、イテレータが要素を取り出した後にその要素を削除するためには、バイナリサーチツリーから要素を削除する操作が必要です。具体的な実装方法は問題によりますが、通常はバイナリサーチツリーの削除操作を使って要素を削除します。

以上が「Binary Search Tree Iterator II」問題の解法の概要です。この方法を実装することで、バイナリサーチツリー内の要素を効率的に昇順で反復処理し、要素の削除も可能になります。

最後に、以下にコードの一例を示します(Pythonを使用しています)。

class BSTIterator:
    def __init__(self, root: TreeNode):
        self.stack = []
        self._leftmost_inorder(root)
    def _leftmost_inorder(self, node):
        while node:
            self.stack.append(node)
            node = node.left
    def next(self) -> int:
        topmost_node = self.stack.pop()
        if topmost_node.right:
            self._leftmost_inorder(topmost_node.right)
        return topmost_node.val
    def has_next(self) -> bool:
        return len(self.stack) > 0

このコードでは、BSTIteratorクラスがバイナリサーチツリーのイテレータを実装しています。__init__メソッドでは、与えられたバイナリサーチツリーのルートノードから最も左のノードまでたどり、その途中で出発するノードをスタックに積んでいます。nextメソッドでは、スタックのトップからノードを取り出し、そのノードの値を返します。もし取り出したノードが右の子ノードを持っている場合は、右の子ノードから最も左のノードまでたどることで、次の最小要素をスタックに追加します。has_nextメソッドでは、スタックに要素が残っているかどうかをチェックします。

以上が、バイナリサーチツリーのイテレータを実装する方法です。この方法を使うことで、効率的にバイナリサーチツリー内の要素を反復処理することができます。また、要素の削除も可能になります。

この解法は、バイナリサーチツリーの性質を活かしたシンプルなアプローチです。他の解法と比べても効率的であり、実用的なコードを提供しています。ぜひこの方法を参考にして、Binary Search Tree Iterator II問題を解いてみてください!