• ベストアンサー

木のなぞり順をかえるプログラムについて

質問です。 完全2分木Tで、Tの行きがけ順のリストを帰りがけ順のリストに変えるプログラムを作ろうと思うのですが。 この問題で、与えられるのは、行きがけ順のリストですよね?それから、帰りがけ順のリストを作るときには、やはり、一度行きがけ順から木を作り直してそれから帰りがけ順のプログラミングをするべきなのでしょうか?しかし、例えば、いきなり、nodeを整数型として、1,2,4,5,6,7,8,9,10などと与えられても、どのような木かというのもわかりません。わかることといえば、最初の2を最後にまわすこと。 考え方を教えてください。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#30727
noname#30727
回答No.5

#1です。 「葉以外のどの節点も2つの子を持つ木を考える」だけでは行きがけ順のリストなんてありえない。 時間があるなら問題の意図を出題者に問う。時間がなければ、問題の抱える矛盾の考察も回答の一部とし、なんらかの前提を自分で設定して進めるしかないでしょう。

その他の回答 (5)

回答No.6

No.4です。 >よって、完全2分木で考えていいのですか?? と僕に聞かれても困るので出題者に確認してください。。完全2分木を前提とするって解答に書けば問題ない気はしますが。 ちょっと気になっていたのが、「リスト」という言葉です。質問文からノードを単純に並べた1次元配列を想像していたのですが、もともとの問題文にリストという言葉が使われているのであれば、そうでない可能性があります。 プログラムで木を実装するときに、単方向リストとか双方向リストとか呼ばれるものをよく使うからです。大抵は構造体と構造体へのポインタで実現します。出題者の意図として木の設計まで含んでいるのかもしれませんね。

回答No.4

No.2です。 僕が知っている完全2分木は、 完全2分木(complete binary tree): どのレベルにおいても非終端ノードが完全に詰まっている2分木 です。これと違う完全2分木の定義を使われているのであれば、1次元配列のノードを復元するのは無理だと思います。ノードの接続情報も一緒にもらう必要がありますね。

ikecchi
質問者

お礼

ありがとうございます。 そうなんです。問題文には、葉以外のどの節点も2つの子をもつ木を考えていました。よって、おそらく完全2分木だけをさしているのではないと思うのですが。 ただ、おっしゃられたように、この場合、行きがけ順のリストだけを与えられても、帰りがけ順のリストを求めるのは不可能ですよね??よって、完全2分木で考えていいのですか??

noname#30727
noname#30727
回答No.3

#1です。 >とは考えられないでしょうか?この木での帰りがけ順と上の木の帰りがけ順のリストは明らかに異なります。 Tが完全2分木である以上、いびつな形になってはいけないので、要素数にしたがって、ただ1つの形になる事が前提となります。 そして与えられるのは、Tの行きがけ順リストなので、そのリストにも矛盾が無い事が前提となります。

ikecchi
質問者

お礼

ありがとうございます。 実は、問題文には、葉以外のどの節点も2つの子を持つ木を考えると書いてありました。そこで、始めは勝手に完全2分木だと解釈したのですが。どうもそうではなさそうなのです。 この場合、ただ行きがけ順のリストを与えられても、そこから帰りがけ順のリストを求めるのは不可能ですよね?やはり、完全2分木で考えるのが妥当なのでしょうか?

回答No.2

質問の通り、行きがけ順リスト→完全2分木リスト→帰りがけ順リストに変換していくのが分かりやすいかと。ノード数が固定ならあらかじめ変換テーブルを作る手もありますね。 完全2分木を1次元配列(node[1],node[2]...)にする場合、    1   2 3 4 56 7 の順番で並べます。あるn番目のノードに対して左のノードは2n、右のノードは2n+1、親はn/2になります。

ikecchi
質問者

お礼

ありがとうございます。 質問です。考えていたのですが、木を与えられた行きがけ順のリストから復元するときに、いろいろな木ができてしまうことに気づきました。たとえば、上の木では他に    1   2 3  4 5   6 7 というように。この場合はどう対処したらよいのでしょうか? また、最初のリストが与えられるのですが、それは、どのようにして与えられるのでしょうか?いきなり、行きがけ順のリスト 1,2,3,4,5,6,7のように与えられるのでしょうか?この場合、1は根ですが、それ以降は根からどのように枝分かれしているのかわからないと思うのですが。 よろしくお願いします。

noname#30727
noname#30727
回答No.1

例えばABCDEFGの7文字を完全2分木にする。    D  B   F A C E G この場合、通りがけ順にA~Gが並ぶことになる。 与えられるリストは木を作るのに最適な行きがけ順になっている。    1  2   5 3 4 6 7 この順番から行きがけ順のリストはDBACFEGと与えられる事になる。 このリストを帰りがけ順に並び替えれば良い。    7  3   6 1 2 4 5 つまり、DBACFEGと与えられたリストをACBEGFDというリストに並び替える。

ikecchi
質問者

お礼

ありがとうございます。ただ、おっしゃっていることがさっぱり理解できていません。 やはり与えられたリストから木を作り直し、それから帰りがけ順でリストをするということなのでしょうか? また、もし上の木が     1    2 7   3 4    5 6 とは考えられないでしょうか?この木での帰りがけ順と上の木の帰りがけ順のリストは明らかに異なります。

関連するQ&A