二分探索木の基礎

概要

  • keyを効率良く探すことができ、かつmin/maxも同様に効率的に探せる
  • keyの範囲も探すことができる
  • ソートされた配列と似ているが、keyの挿入と削除が効率的に行える
  • あるkeyの左側の木のノードはすべてkey以下で、右側の木のノードはすべてkey以上になる
  • 木が偏っていると挿入と削除はO(n)になるが、高さのバランスが取れた木はO(logn)となる
  • 赤黒木はバランスのとれた木のひとつ
  • ソート済みの要素をO(n)でイテレートできる
  • 二分探索木とハッシュテーブルの組み合わせが有効な問題もある

二分探索木の実装

class BstNode:
  def __init__(self, data=None, left=None, right=None):
    self.data, self.left, self.right = data, left, right

二分探索木の探索

def search_bst(tree, key):
  return (
    tree if not tree or tree.data == key else search_bst(tree.left, key)
    if key < tree.data else search_bst(tree.right, key))
  )

14.1 二分木が二分探索木の条件を満たすかどうか

def is_binary_tree_bst(tree):
  QueueEntry = collections.namedtuple('QueueEntry', ('node', 'lower', 'upper'))
  
  bfs_queue = collections.deque([QueueEntry(tree, float('-inf'), float('inf'))])
  
  while bfs_queue:
    front = bfs_queue.popleft()
    if front.node:
      if not front.lower <= front.node.data <= front.upper:
        return False
       bfs_queue += [
        QueueEntry(front.node.left, front.lower, front.node.data),
        QueueEntry(front.node.right, front.node.data, front.upper)
       ]
  return True
このエントリーをはてなブックマークに追加
Takatomo Honda avatar
About Takatomo Honda
システム開発 / プロトタイプ開発 / 開発組織の構築 / アプリケーションの内製化 /等、お気軽にご相談ください。