概要
二分探索木とは
どのノードにおいても、左の子ノード<親ノード<右の子ノードとなるような木。
探索パターン
深さ優先探索(DFS: Depth first search)
それぞれのノード探索順はwww.momoyama-usagi.com - うさぎでもわかる2分探索木 後編 2分探索木における4つの走査方法に記載されている方法が覚えやすいのでそちらのリンクを記載する。
preorder(先行順/前順/行きがけ順)
ルートノードから走査を開始し、左部分木、右部分木の順で再帰的に走査する。
rootがpre(事前)なので根→左→右と覚えておく良い。(根の位置だけ覚えておけば良い。左、右は必ず左が先になる。)
木を一筆書きで括ったときに、ノードの左側を通った順がpreorder。
inorder(中間順/間順/通りがけ順)
左部分木から再帰的に走査し、ルートノード、右部分木の順に走査する。
rootがin(間)なので左→根→右と覚えておく良い。(根の位置だけ覚えておけば良い。左、右は必ず左が先になる。)
木を一筆書きで括ったときに、ノードの下側を通った順がinorder。
postorder(後行順/後順/帰りがけ順)
左部分木から再帰的に走査し、右部分木、ルートノードの順で走査する。
rootがpost(事後)なので左→右→根と覚えておく良い。(根の位置だけ覚えておけば良い。左、右は必ず左が先になる。)
余談だが、逆ポーランド記法はスタックで解くこともできるが、二分木をpostorderでも解くことができる。
木を一筆書きで括ったときに、ノードの右側を通った順がpostorder。
幅優先探索(BFS: Breadth first search)
深さごとに走査する。
実装
ソースコードはbinary_search_treeにある。
幅優先探索は、根の探索開始位置(preorderなら根→左→右)だけ覚えておけば再帰処理はそれに従って書ける。
深さ優先探索は少し面倒。後は二分探索木に限らずノードの削除処理はもっと面倒...。
所感
探索パターンはとりあえずこうやって覚えておけば頭には留められそう。
参考
- www.momoyama-usagi.com - うさぎでもわかる2分探索木 後編 2分探索木における4つの走査方法
- 走査方法が大変覚えやすく、参考にさせて頂いた