はじめに
基本情報技術者試験の科目Bでは、二分木の走査(巡回) がよく出題されます。
参考書を見ると、
左 → 右 → 自分
と書かれていることが多いですが、
- 「自分って誰?」
- 「node.val って何?」
- 「何を出力しているの?」
と混乱する人も多いです。
今回は、そんな疑問を ハク と レイ と一緒にやさしく解説します。

ハク
左→右→自分って書いてあるけど…
『自分』って誰のこと?

レイ
今見ているノード(節)のことですよ。
二分木とは?
二分木とは、1つのノードが
- 左の子
- 右の子
を持つデータ構造です。
今回の例は次のような木になっています。

ノードとは?
図の中の丸1つ1つが ノード(節) です。
例えば、
×÷+ab
などがすべてノードです。
node.val とは?
各ノードには値が入っています。
| ノード | node.val |
|---|---|
× | × |
+ | + |
a | a |
f | f |
つまり、
node.val
は
今見ているノードの値
を表します。

ハク
node.val は、今見ている文字ってことか!

レイ
その通りです。
「自分」とは?
「自分」とは、
今
traverse(node)に渡されている node
のことです。
例1
traverse(×)
このときの自分は ×
例2
traverse(+)
このときの自分は +
例3
traverse(a)
このときの自分は a
後順走査(Postorder Traversal)とは?
後順走査では、
左 → 右 → 自分
の順番で処理します。

+ の部分だけ見る
処理順:
ab+
出力:
ab+

ハク
最後に + を出力するんだね!

レイ
はい。これが『自分』です。
プログラム
traverse(Node: node)
if (node が 未定義)
return
else
traverse(node.left)
traverse(node.right)
node.val を出力する
endif
なぜこの順番で出力されるの?
木全体では、

左部分木の出力
ab+cd-÷
右部分木の出力
ef+
最後にルート
×
最終結果
ab+cd-÷ef+×

ハク
問題文の出力結果と同じだ!

レイ
これで後順走査だと分かります。
前順・中順・後順の違い
| 走査方法 | 順番 |
|---|---|
| 前順走査 | 自分 → 左 → 右 |
| 中順走査 | 左 → 自分 → 右 |
| 後順走査 | 左 → 右 → 自分 |
覚え方
- 前順:自分が先
- 中順:自分が真ん中
- 後順:自分が最後

ハク
自分が最後に出てきたら後順走査!
まとめ
- ノード = 木の中の1つ1つの丸
node.val= 今見ているノードの値- 「自分」 = 現在のノード
- 後順走査 = 左 → 右 → 自分
- 今回の出力結果は
ab+cd-÷ef+×

レイ
『自分』とは、今処理しているノードのことです。

ハク
それが分かれば、後順走査って意外と簡単だね!


コメント