Open maraigue opened 5 years ago
前回、実装に詰まり気味だったので参考になりそうな配列操作ライブラリを探す
eraseを実装していた(未完成)。 STLのeraseだと「削除した要素の次の要素にあたるイテレータを返す」という処理があるが、現状のリストの実装では単にイテレータを指定して削除するところしかしておらず、戻り値に対応したかった。 それをちゃんと実装しようとすると現状の実装では面倒だということに気づき、設計を見直していた。
二分探索木の頂点を与え、それを削除する。ただし平衡を保つ処理をしやすくするため、左右の子をともに持つ頂点は木から直接取り除けず、もし存在するならば一つ前か一つ後ろの要素を表す頂点(これが左右の子をともに持つことはありえない)と値を交換してから削除しないとならない。
考えられる状況
処理の場合分け
実際の処理
n
とする。n == end() - 1
なら、
n
を削除するreturn end()
n != end() - 1
なら、
n
の一つ先の要素を表す頂点を取得する。 o
とする。n
に左の子と右の子の両方が存在するなら、n
と o
で値のみ交換する。o
を削除する。return n
n
に左の子と右の子の両方は存在しないなら、n
を削除するreturn o
補足
end() - 1
(back()
に相当する頂点)はすぐ取得できるので問題ない。
引き続き、「要素取得も挿入・削除も対数時間でできるリスト構造」を実装する。 必要なメソッドを順次作っていく。前回でinsertメソッドがちゃんとできたので、他のメソッドもテストしやすくなっているはず…