[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
GREサブジェクトテストCS分野問題第7問。2分木(binary tree)に関する問題。
まず、「木(tree)」とは何か、ってことから説明しようかな。あ、でも、その前に、どういうのが木なのか?ってのを実際に例示しといた方が話が早いか。つわけで、どん。
ま、これ見てもらえれば直感的に、「あ、なるほど」だとは思うんだけど、一応くだくだしく言うと、
- 「根(root)」と呼ばれる点が1つある(この図だと、1が根)
- ある点と点が結ばれているとき、根に近い方を「親(parent)」、遠い方を「子(child)」と呼ぶ(たとえば、上の図で1と7は1が親で7が子)。
- 根は親を持たない。
- 子は1つの親しか持たない。
- 子のない点を「葉(leaf)」と呼ぶ(たとえば、2とか5とかが葉)。
って感じ。
で、2分木ってのは、上記の木の定義に「各点について、たかだか最大2つの子しか持たない」という制約を加えたもの。上の図は、もうまさに2分木。
さて、こうした2分木ってのは、その各点にデータが保持されていて、それを順々に取り出す、って使われ方をしたりするんだけど、そういう「順々に」各点を訪れるやり方ってのがまあ色々あって、ここでは「プレオーダ・トラヴァーサルpreorder traversal」、「インオーダ・トラヴァーサルinorder traversal」「ポストオーダ・トラヴァーサルpostorder traversal」というのを説明。
ほんじゃ、ちょっと次のコードを見てもらいましょ。
visit(node)
/* preorder */ if node.left != null then visit(node.left) /* inorder */ if node.right != null then visit(node.right) /* postorder */
で、このコードの/* preorder */の部分にprint node.valueを代入したものがプレオーダ・トラヴァーサルのアルゴリズム、/* inorder */の部分に……って感じなんだけど、うーん、これだけじゃよう分からんだろうから、上の図を例に、コードを追ってみよう。
プレオーダ・トラヴァーサルの場合
- 最初のvisit(node)で根を訪れる。
- 次に、/* preorder */にはprint node.value代入されているわけだから、その根の値、つまり1を出力(print)する。
- 3行目ではまず、今いる点の左に子がいるかどうかを検査する(if node.left != null)。子がいる場合、その子を「根」として、再帰的にvisit(node)を実行する(上記の図の場合、根に子7がいるわけだから、visit(7)が実行される)。
- visit(7)では、まず7が出力され、次に7の左に子がいるかどうか検査される。この場合、7には子2がいるから、visite(2)が実行される。
- visit(2)では、まず2が出力され、2の左に子がいるかどうか検査されるが、この場合いないので、次のラインで2の右に子がいるかどうか検査される。2には右にも子がいないので、このvisit(2)ルーチンはここで終了。
- さて、visit(2)は工程4のif node.left != null then visit(node.left)で呼び出されていたのだから、その次、つまりvisit(7)のif node.right != null then visit(node.right)に処理が戻る。つまり、7の右に子がいるかどうかが検査され、子がいる場合、その子を元にvisit(node)が呼び出される。上図の場合、7の右には子6がいるから、visit(6)が呼び出される。
- ……
という具合に、結局上図の場合、このコードの出力は、「1,7,2,6,5,11,3,9,4」となる。
そして、インオーダの場合は「2,7,5,6,11,1,3,4,9」、ポストオーダの場合は「2,5,11,6,7,4,9,3,1」って具合。
まあ、話を聞いただけじゃ分かんないだろうから(って、お前の説明が下手くそなんじゃ!と言われれば、何とも言い返せないけど)、是非上記のコードの挙動を、紙に書き下ろしてみたりしてください。そうすりゃ、何となく分かってくる、と思います。
10 | 2024/11 | 12 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
音
雑
虫
技術
『スペクタクルの社会』を読む
ドゥルーズ講義録
電波
趣味の数学
趣味のゲーデル
『プリンキピア・マテマティカ』を読む
自己紹介もどき
ブログペット俳句
芸術一般
言語ヲタ
お客様
GRE CS
留学
Boing Boing
映画
ちょっといい話
かなりダメな話
魂の叫び
哲学と数学
論文
引用
「いい」とも「ダメ」とも言いがたい話
悲喜こもごも
証明論
ポエム
書物への呪詛
言わずもがななことではあるけれどときに忘れてしまうこと
何か無駄なことをしよう
日々
趣味の勉強
夢
ブログの記事
翻訳
勉強
不眠
文房具
ライフハック
育児
thayashi#ucalgary.ca
(#を@に置換してください)
このブログで紹介したことのある本をランダム表示。
このブログで紹介したことのある音をランダム表示。