令和6年度 春期 応用情報技術者試験 午前 問6

各ノードがもつデータを出力する再帰処理 f(ノード n)を定義した。この処理を,図の2分木の根(最上位のノード)から始めたときの出力はどれか。

〔f(ノード n)の定義〕

  1. ノード n の右に子ノード r があれば,f(ノード r)を実行
  2. ノード n の左に子ノード l があれば,f(ノード l)を実行
  3. 再帰処理 f(ノード r),f(ノード l)を未実行の子ノード,又は子ノードがなければ,ノード自身がもつデータを出力
  4. 終了
図 2分木の構造
図の説明テキスト

2分木の構造図。
根ノードは「+」
「+」の左の子ノードは「A」、右の子ノードは「÷」
「÷」の左の子ノードは「×」、右の子ノードは「-」
「×」の左の子ノードは「B」、右の子ノードは「C」
「-」の左の子ノードは「D」、右の子ノードは「E」

解答・解説

正解: エ. ED-CB×÷A+

再帰処理とは

再帰処理とは、ある処理の実行中に再び自分自身を呼び出す手法のことです。木構造のデータを探索する際によく用いられます。2分木における探索では、左の子、右の子、親ノードをどの順番で処理するかによって、データの出力順序が変わります。

正解の根拠

図の2分木は次のように構成されています。

  • 根ノードは「+」
  • 「+」の左の子ノードは「A」、右の子ノードは「÷」
  • 「÷」の左の子ノードは「×」、右の子ノードは「-」
  • 「×」の左の子ノードは「B」、右の子ノードは「C」
  • 「-」の左の子ノードは「D」、右の子ノードは「E」

与えられた再帰処理 f(n)f(n) の定義に従うと、各ノードにおいて「右の子の処理 →\rightarrow 左の子の処理 →\rightarrow 自身の出力」という順序で実行されます。根ノード「+」から始めたときの処理の流れは以下の通りです。

  1. f(+)f(+) : 右の子「÷」に対して f(÷)f(÷) を実行
  2. f(÷)f(÷) : 右の子「-」に対して f(-)f(-) を実行
  3. f(-)f(-) : 右の子「E」に対して f(E)f(E) を実行。子がないため「E」を出力
  4. f(-)f(-) : 左の子「D」に対して f(D)f(D) を実行。子がないため「D」を出力
  5. f(-)f(-) : 子の処理が完了したため、自身の「-」を出力
  6. f(÷)f(÷) : 左の子「×」に対して f(×)f(×) を実行
  7. f(×)f(×) : 右の子「C」に対して f(C)f(C) を実行。子がないため「C」を出力
  8. f(×)f(×) : 左の子「B」に対して f(B)f(B) を実行。子がないため「B」を出力
  9. f(×)f(×) : 子の処理が完了したため、自身の「×」を出力
  10. f(÷)f(÷) : 子の処理が完了したため、自身の「÷」を出力
  11. f(+)f(+) : 左の子「A」に対して f(A)f(A) を実行。子がないため「A」を出力
  12. f(+)f(+) : 子の処理が完了したため、自身の「+」を出力

これらを順番に並べると、「ED-CB×÷A+」となります。

各選択肢の解説

  • ア: 指定された「右の子 →\rightarrow 左の子 →\rightarrow 自身」という実行順序に合致しないため、誤りです。

  • イ: 指定された「右の子 →\rightarrow 左の子 →\rightarrow 自身」という実行順序に合致しないため、誤りです。

  • ウ: 指定された「右の子 →\rightarrow 左の子 →\rightarrow 自身」という実行順序に合致しないため、誤りです。

  • エ: 正しい実行順序で導き出される結果です。

Spineチーム