問題 #12 ・ 木構造・グラフ ・ 難易度 2
完全二分木を配列で表現する。根を要素番号 1 に格納し、要素番号 i のノードの左の子を要素番号 2×i に、右の子を要素番号 2×i+1 に格納する。 次の関数 getDepth は、要素番号 pos で指定されたノードの深さ(根の深さを 0 とする)を返す。プログラム中の〔 a 〕と〔 b 〕に入れる字句の正しい組合せを、選択肢の中から選べ。 ここで、配列の要素番号は 1 から始まる。また、÷ の結果は小数部を切り捨てた整数とする。
○整数型: getDepth(整数型: pos)整数型: depth ← 0while (〔 a 〕)pos ← 〔 b 〕depth ← depth + 1endwhilereturn depth
完全二分木の配列表現では、要素番号 i のノードの親は要素番号 i ÷ 2(切り捨て)にある。根の要素番号は 1 なので、pos が 1 より大きい間だけ親をたどればよい。 【トレース例】getDepth(5) を呼んだ場合(ノード 5 は根→左の子→右の子の位置、深さ 2): 初期状態: pos = 5, depth = 0 1回目: 5 > 1 → true, pos ← 5 ÷ 2 = 2, depth ← 1 2回目: 2 > 1 → true, pos ← 2 ÷ 2 = 1, depth ← 2 3回目: 1 > 1 → false → ループ終了 return 2 深さ 2 が正しく返される。 誤答の確認: ・ア/ウ(pos > 0 または pos ≧ 1): pos = 1 のときもう1回ループが回り depth が 3 になる。 ・エ(pos - 1): 親に移動せず番号を 1 ずつ減らすだけなので depth = 4 になる。 ・オ(pos > 0 かつ pos - 1): depth = 5 になる。
登録すると解いた結果が残り、間違えた問題は日をおいて復習に出ます。
この問題は AI が作り、別の AI に解かせて検証し、人が確認したうえで公開しています。 誤りに気づいたら goku.tore9@gmail.com までお知らせください。
記号の意味に迷ったら擬似言語の記法で確かめられます。