プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

平衡二分探索木とは?データ構造の仕組みと平衡化手法をわかりやすく解説

平衡二分探索木とは

本記事では、平衡二分探索木(Balanced Binary Search Tree)について詳しく解説します。二分探索木(BST:Binary Search Tree)は、各ノードに対して「左の子にはより小さい要素、右の子にはより大きい要素」が配置されるという性質を持つ二分木です。

二分探索木の課題:木が偏る問題

二分探索木での要素検索は、平均的にO(log n)の時間計算量で実行できます。ただしこれは、二分探索木の高さに依存します。BSTの性質を保ちながら要素を挿入していくと、挿入順序によっては木が片側に偏ってしまう(スキューした状態になる)ことがあります。

木が極端に偏ると、以下のような形になります。

平衡二分探索木とは?データ構造の仕組みと平衡化手法をわかりやすく解説

上記は確かに木構造ではあるものの、見た目としては連結リストとほぼ変わりません。このような偏った木の場合、検索の時間計算量はO(n)まで悪化し、二分探索木本来の高速な検索性能をまったく活かせなくなります。

平衡化による解決策

こうした問題を防ぐために有効なのが、「高さのバランスが取れた(height-balanced)」木を構築することです。意識的にバランスを保つことで、木が偏るのを防ぎます。具体的には、各ノードの左右の部分木の高さがほぼ同じになるように木を構成します。

代表的な平衡化手法

木を平衡状態に保つための手法はいくつか存在しますが、特に有名なものとして次の2つが挙げられます。

  • AVL木(AVL tree)
  • 赤黒木(Red-Black Tree)

平衡化後の木の形

先ほどの偏った木を、高さのバランスが取れた形に再構成すると、次のようになります。

平衡二分探索木とは?データ構造の仕組みと平衡化手法をわかりやすく解説

このように平衡二分探索木を用いることで、最悪の場合でもO(log n)の検索性能を安定して維持でき、効率的なデータ管理が可能になります。

  1. 【入門】データ構造の二分探索木(BST)とは?C++での実装例もわかりやすく解説

    二分探索木とは二分探索木(Binary Search Tree:BST)は、特定の性質を満たす二分木の一種です。この性質のおかげで、木の中から目的の値を効率的に検索できることが大きな特徴です。主な性質は以下のとおりです。すべての二分探索木は二分木である左の子ノードには、親(ルート)より小さい値が格納される右の子ノードには、親(ルート)より大きい値が格納される理想的な二分探索木では、同じ値を重複して保持しない例として、次のような木を考えてみましょう。この木は上記の性質をすべて満たしているため、正しい二分探索木といえます。ここで注目すべき点として、この木を中順走査(インオーダー走査)で巡回すると、

  2. 二分木(バイナリツリー)のデータ構造と重要な性質を解説

    二分木(バイナリツリー)とは、各ノードが持てる子ノードの数を最大2つに制限した木構造のデータ構造です。本記事では、この二分木が持つ重要な性質について、具体例とともにわかりやすく解説します。まず、次のような二分木を例に考えてみましょう。二分木の主な性質各レベルの最大ノード数:レベル「l」における最大ノード数は 2l−1 です。ここでいうレベルとは、根(ルート)からそのノードまでの経路上にあるノードの総数を指し、ルート自身も含みます。なお、ルートのレベルは1として扱います。木全体の最大ノード数:高さ h の二分木に含まれる最大ノード数は 2h−1 です。ここでいう高さとは、ルートから葉までの経路上