基本情報技術者 2019年 春期 午前(科目A) 問05
問題文
2分探索木として適切なものはどれか。ここで、数字1〜9は、各ノード(節)の値を表す。

選択肢
ア:
イ:(正解)
ウ:
エ:
🔒 解説は解答すると表示されます
二分探索木の判定【午前解説】
正解の理由
正解は イ です。
二分探索木(BST)の定義は各ノードについて「左部分木のすべての値 < ノードの値 < 右部分木のすべての値」が成り立つことです。イの木について:
二分探索木(BST)の定義は各ノードについて「左部分木のすべての値 < ノードの値 < 右部分木のすべての値」が成り立つことです。イの木について:
- 根 4:左部分木の値 {1,2,3} はすべて 4 未満、右部分木の値 {5,6,7,8,9} はすべて 4 より大きい。
- ノード 2:左 1 < 2 < 3(右)で成立。
- ノード 8:左部分木 {5,6,7} はすべて 8 未満、右は 9 > 8 で成立。
- ノード 6:左 5 < 6 < 7(右)で成立。
さらに中間順走査(左-根-右)を行うと 1,2,3,4,5,6,7,8,9 と厳密単調増加になり、BST の条件を満たしていることが確認できます。
解法ステップ
- 定義を確認する:「任意のノードに対して左部分木の全値 < ノードの値 < 右部分木の全値」。
- 手早いチェック法1(試験向け): 中間順(in-order)走査を紙上で行い、出力が厳密に昇順かを確認する。
- 手早いチェック法2(厳密): 根から再帰的に許容される最小値・最大値の範囲を維持しながら各ノードを検証する(min/max 法)。
- 計算量: いずれも O(n)(n はノード数)で判定可能。中間順走査は一度で全順序を確認できるため実務・試験ともに有効。
選択肢別の誤答解説
- ア:根が 1 で、左子に 2 があるため即違反。左部分木の値が根より大きいので BST の条件に反します。
- イ:正解。上記の通り、すべてのノードで左部分木 < ノード < 右部分木 が成り立ち、中間順走査が 1..9 の昇順になります。
- ウ:一見局所的には成り立つ箇所もありますが、根 7 の右部分木に値 3(8 の左子)が含まれており、3 < 7 であるため「右部分木の値はすべて 7 より大きい」という条件に違反します。
- エ:根が 9 ですが右子が 8(9 より小さい)になっており、右部分木に根より小さい値があるため即違反です。
よくある誤解
- 親子の大小関係だけをチェックしてしまう:親と直接の子が条件を満たしていても、部分木内のさらに深いノードが範囲を破ることがあります。
- 二分探索木 = 完全にバランスが取れている木と誤解する:形(高さ)とは独立して、値の順序性が条件です。
- 中間順走査の意味を誤る:中間順走査が昇順であれば BST、という判定を思い出せないと手早く判断できません。
補足コラム
- 中間順(in-order)走査は二分探索木の判定で強力なツールです。ノード値に重複がない場合は「中間順の出力が厳密増加」⇔「BST」で双方向に成り立ちます。
- 重複キーの扱いは実装や定義により「左 ≤ 親 < 右」や「左 < 親 ≤ 右」など変わるので、問題文での定義(通常は厳密不等号)を確認してください。
- 実装例(迅速判定):中間順走査を用い、前の出力値と比較しながらトラバースする方法がおすすめです。
コード例(in-order で判定する簡易実装)
def is_bst_inorder(root):
prev = None
def inorder(node):
nonlocal prev
if not node:
return True
if not inorder(node.left):
return False
if prev is not None and node.val <= prev:
return False
prev = node.val
return inorder(node.right)
return inorder(root)
FAQ
Q1: 判定で一番速く確実な方法は?
A1: 中間順走査で出力が厳密増加かを確認する方法が手早くて確実です。ミスも少ないので試験向け。
A1: 中間順走査で出力が厳密増加かを確認する方法が手早くて確実です。ミスも少ないので試験向け。
Q2: 親子の比較だけで OK ですか?
A2: いいえ。親子比較だけでは部分木内のさらに深いノードが範囲を破るケースを検出できません。
A2: いいえ。親子比較だけでは部分木内のさらに深いノードが範囲を破るケースを検出できません。
Q3: 同じ値(重複)がある場合は?
A3: 問題ごとに定義が必要です。多くの試験問題ではノード値は互いに異なる設定ですが、定義に従い「左 ≤ 親 < 右」などの扱いを確認してください。
A3: 問題ごとに定義が必要です。多くの試験問題ではノード値は互いに異なる設定ですが、定義に従い「左 ≤ 親 < 右」などの扱いを確認してください。
関連キーワード: 二分探索木、BST、二分木、二分探索、中間順走査、in-order、再帰、min/max 判定、木構造、トラバース、探索アルゴリズム、検証手順

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

