• 締切済み

配列による二分木

数値表現で書かれているString(infix)を受け取ってlevel-order-traversalの配列に変換するプログラムを作りたいのですが。どうやって書いたらいいかさえもわかりません。さらに、Level-orderからPostfixとlevel-orderからprefixに画面に出力する方法も知りたいのですが、アドバイスをもしよかったらお願いします。 質問の補足として、 2*X/5+3*Y-4*Z-1   (infix) をStringで受けたファンクションから -/-*+*12X5*4Z 3Y (level order) (空のノードと一番初めはスペースにしてます) っという風に変えたいということです。 二分木は ....................- .......... /....................- .....*........+..........*..........1... 2..X.....5...*......4...Z................ ................3..Y......................... のようになっています。(ちょと解りづらくて申し訳ないですが.を抜かした部分が木になっています) どなたかわかる方よろしくお願いします。

みんなの回答

回答No.2

大学レベルの課題だと思いますが、作成者のレベルが推し量れる良い課題だと思います。 で、アドバイスだけですが 1.ノードのクラスを設計する  (符号をどのように扱うか、レベル自体をノードの情報として保持するか) 2.Treeのクラスを設計する  (追加・削除・表示の機能を実装) 3.infixの内容を解析するプログラムの検討  (スタックを利用して、逆ポーランド表記に変換するのが楽かな) 4.スタックしたデータでノードのインスタンスを作成してTreeに追加 5.Treeの内容を表示  (ついでにPreorderやInorderなど別の巡回法も実装すれば+αの評価がもらえるかも) 二分木も逆ポーランドのプログラムもネットで多数Hitするので参考にすればよいでしょう。

syonen
質問者

お礼

返事が遅くなって申し訳ないです。 なんとか、先生の助けを借りて、終わらせる事ができました。 ChateauAresもとても参考になりました。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.1

>2*X/5+3*Y-4*Z-1   (infix) >-/-*+*12X5*4Z 3Y (level order) こうはならないと思うのだけど?? 演算子の優先順位とかは通常の*/は+-より先に計算というものではないのでしょうか? 全部の演算子が等価だとすれば、手前から順になるべきだと思うし。 私の理解が間違っているのでしょうか? どうしてこうなるのかアルゴリズムを補足して下さい。 でないとプログラムは書けません。

syonen
質問者

補足

すいません、間違えてました。。 問題は(2*X)/(5+3*Y)-(4*Z-1) というのを前提としてました。 でもちょっとわかりづらいので、例を変えようと思います。 56+34*2-36*12/3+5*13-5*4+6 (infix) の場合 + - 6 + * - * 5 4 + * 5 13 56 * 36 / 34 2 12 3 (level order) となると思いますが、また間違ってたらすいません。 >演算子の優先順位とかは通常の*/は+-より先に計算>というものではないのでしょうか? はい、普通の計算の優先順位であっています。 そして、質問は、infixをStringで受け取り、level order の配列で返すという質問でした。 方法としては、演算子の優先順位順に演算子を前に持っていってその後に近くの数字を次に持ってくる!?のような方法で配列を並び替えればいいのでしょうか? どういう方法で並び替えてよいのかわからなくて困っています。もし、わかるようでしたらアドバイスお願いします。 質問の内容がわからないようであったら、まだ補足します。間違いを指摘していただいてありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A

  • 3次元配列から2次元配列に

    3次元配列のデータを2次元配列に移すにはどのように したらよいのでしょうか.とりあえず下記のように考えてみましたが. data3[500][500][4000]; //3次元配列 data2[500][500]; //2次元配列 for(y=0; y<500; y++) for(x=0; x<500; x++){ for(z=0; z<4000; z++){ data2[y][x] = data3[y][x][z]; } } } これでいいのでしょうか?

  • 木構造を描写すると重なる

    vectorに入った要素をある順序で木構造で表現しようとしてます。 まず bbについてですがi=0から増えていくごとに0,-1,1,-2,2というようになります。これにより一つ目の子ノードは親ノードのy座標と同じ位置で次はposY(親ノードのY座標)-1*y1*2となり次は反対側にという風に下上下上という風に描写していきます。それを再起呼び出しで繰り返すことで全ての文字を木構造表現しています。 木構造の表現は出来ているのですが問題があります。子ノード同士が同じ座標に描かれます。どういうことかというと同じ親ノードを持つ複数の子ノード(子2、子3とします)同士がさらに複数の子ノード(子4)を持つ時に、子4は子4の子3ノードと重なってしまいます。y座標の決定がbbによって同じ振幅になるからだと思います。 しかし打開策が思いつかないので考えられる方法を教えていただきませんか? 下のプログラム自体はそれほど必要でないと思いますので細かい説明は辞めておきます。 class drawpair{ int bb=0;//子ノードのy座標を決める値 int x1; public drawpair(Graphics g,Vector x,int posX,int posY,Vector causal1){ for(int i=0;i<x.size();++i){ if(i==0){ //親ノードの描写.DrawWordで文字を描写します。 new DrawWord(g,(String)x.elementAt(i),posX,posY); }else{ //y座標を決めるbbの値の設定。 bb +=(int) Math.pow(-1,i)*(i-1); new DrawWord(g,(String)x.elementAt(i),getFontMetrics(f1).stringWidth((String)x.elementAt(0))+posX+50,posY+bb*2*y1); PairNode tes = new PairNode(); x1=tes.nextNode((String)x.elementAt(i),causal1); if(x1!=-1){ new drawpair(g,(Vector) causal.elementAt(x1),getFontMetrics(f1).stringWidth((String)x.elementAt(0))+posX+50,posY+bb*2*y1,causal); } } samplevec.removeAllElements(); } } }

    • ベストアンサー
    • Java
  • ExcelVBAで配列をベースに配列を作る方法について

    配列2つからそれぞれ要素を取り出して組み合わせ、 新たな配列を作りたくて下記のコードを書きましたが どうしても★のところで「コンパイルエラー:SubまたはFunctionが定義されていません。」 というエラーになってしまいます。すごく基本的なミスのようでお恥ずかしいのですが、 どうか解決方法・アドバイスをお願いいたします。m(_ _)m なお、最終的に作りたい配列の中身は下記のような規則性を持ったものです。 (後からもっと増やす予定なのでループでの処理を希望しています。) 'RankFirstCell = Array("B10", "B26", "B42", "B58", "B74", "H10", "H26", "H42", "H58", "H74", "N10", "N26", "N42", "N58", "N74") --- 問題の部分はここから --- Dim RankCols, RankRows As Variant RankCols = Array("B", "H", "N") RankRows = Array(10, 26, 42, 58, 74) Dim x, y, z As Byte Dim RankFirstCell(14) As String 'ここの記述の仕方の問題でしょうか? For x = 0 To 14 y = Application.WorksheetFunction.RoundDown(x / 5, 0) z = x Mod 5 RankFristCell(x) = RankCols(y) + RankRows(z) '★エラー行 Next x --- ここまで --- ちなみにx, y, zの値は下記のように希望通りループできているみたいです。(ウォッチウィンドウにて確認) x|y|z ------ 0|0|0 1|0|1 2|0|2 3|0|3 4|0|4 5|1|0 6|1|1 7|1|2 8|1|3 9|1|4 10|2|0 11|2|1 12|2|2 13|2|3 14|2|4 どうぞよろしくお願いいたします。

  • java 配列について

    public class Sample{ public static void main( String[ ] args ){ String x = "pen"; String[] y = new String[1]; y[0] = x; x = "pencil"; System.out.println(y[0]); } } java初心者です。 配列の参照先を変更して 配列の数を変更せず配列0に 実行時にpencilと表示させたいのですが よい方法はありますでしょうか?

    • ベストアンサー
    • Java
  • 配列の変換

    Cで書かれている配列の static GLfloat A [8][3]={ {-5.0,-8.0,-5.0},{-5.0,8.0,-5.0}, {45.0,8.0,-5.0},{45.0,-8.0,-5.0}, {-5.0-8.0,5.0},{-5.0,8.0,5.0}, {45.0,8.0,5.0},{45.0,-8.0,5.0}, }; をObject Pascalの配列に変換したいです。多分、 A : array[X..Y] of GLfloat = (x,y,z,r); の形になると思うのですが、X,Y,x,y,z,rに入る値が分かりません。 (GLfloatはOpenGLの型定義です。Cでいうところのfloat) 分かる方いらしたら教えてください。

  • 多段階配列について

    Edx() = (x,y,z・・・)→Edxは変数の配列 For i = 1 To 3 Idx(i) = Edx() Next みたいなイメージで、 最終的には Idx(1).(x,y,z・・・) Idx(2).(a,b,c・・・) Idx(3).(f,g,l・・・) のような感じにしたいのですが、 どのように宣言、コーディングすれば宜しいんでしょうか?多段階配列について流れを教えていただきたいです。

  • 初心者です。 配列のエラーがどうしても解決できません。 誰か助けてください・・・

    魔方陣のプログラムを考えて書いてみましたが、 エラーが出てしまい実行することができません。 class mahoujin{ public static void main(String args[]){ int n=3; int a[][] = new int[3][3]; int x=0; int y=1; for(int p=0;p<=3;p++){ for(int q=0;q<=3;q++){ a[p][q]=0;} } for(int i=1;i<=n*n;i++){ if((i%n)==1){x++; }else{x--; y++;} if(x==0){x=3;} if(y==3){y=0;} a[x][y]=i;} } } 空の配列や配列を外れるものがあるかをよく考えてみましたが、どうしても解決できません。助けてください・・・

  • VB.NET 2つの配列を連動して並び替える

    VB.NETで2つの配列の一方を文字列の長い順番に並び替えて 他方の配列もその順番に並び替えたいのですが どのようにすればよろしいでしょうか。 例えば、 A(0)="Japan" A(1)="America" A(2)="People's Republic of China" A(3)="Republic of Korea" A(4)="Democratic People's Republic of Korea" B(0)="Tokyo" B(1)="Washington, D.C." B(2)="Beijing" B(3)="Seoul" B(4)="Pyongyang" という2つの配列があって 配列A()を文字列の長い順番に並び替えると A(0)="Democratic People's Republic of Korea" A(1)="People's Republic of China" A(2)="Republic of Korea" A(3)="America" A(4)="Japan" となりますが、この時配列B()も以下のように 配列A()の順番と同じ順番になってほしいのです。 B(0)="Pyongyang" B(1)="Beijing" B(2)="Seoul" B(3)="Washington, D.C." B(4)="Tokyo" なお、配列A()の並べ替えは以下のようにしていますので できましたら、このコードに追記する感じで 教えていただけるとありがたいです。 よろしくお願いします。 ------------------------------------------------------ Module Module1 Sub Main() Dim A(4) As String Dim B(4) As String A(0) = "Democratic People's Republic of Korea" A(1) = "People's Republic of China" A(2) = "Republic of Korea" A(3) = "America" A(4) = "Japan" B(0) = "Pyongyang" B(1) = "Beijing" B(2) = "Seoul" B(3) = "Washington, D.C." B(4) = "Tokyo" Dim comp As New LengthComparer() Array.Sort(A, comp) For Each s As String In A Console.WriteLine(s) Next End Sub Public Class LengthComparer Implements System.Collections.IComparer Implements System.Collections.Generic.IComparer(Of String) Public Function Compare(ByVal x As String, ByVal y As String) As Integer _ Implements System.Collections.Generic.IComparer(Of String).Compare If y Is Nothing AndAlso x Is Nothing Then Return 0 End If If y Is Nothing Then Return -1 End If If x Is Nothing Then Return 1 End If Return y.Length.CompareTo(x.Length) End Function Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _ Implements System.Collections.IComparer.Compare If y Is Nothing AndAlso x Is Nothing Then Return 0 End If If y Is Nothing Then Return -1 End If If x Is Nothing Then Return 1 End If If Not (TypeOf y Is String) Then Throw New ArgumentException("String型でない", "y") ElseIf Not (TypeOf x Is String) Then Throw New ArgumentException("String型でない", "x") End If Return Me.Compare(DirectCast(y, String), DirectCast(x, String).Length) End Function End Class End Module ------------------------------------------------------

  • ファイルからの読み込み 配列

    座標データの数値のテキストファイルから配列の中に座標値を格納したいのですが、int型のデータを読み込んで配列に格納するのは、どのようにプログラムを組めばよろしいのでしょうか?下のようにxzahyou.csvというファイルから配列Z[i]に格納したくて組んでみたら、 br = new BufferedReader(new FileReader("xzahyou.csv")); for(int i=0;i<X.length;i++){ String line = br.readLine(); X[i]=line; X[i] = line;のところで互換性がないと出てきました。int型の場合どのようにすればよろしいのでしょうか?教えてください。お願いします。

  • C言語、配列の積

    整数型二次元配列x,yに適当な値をキーボードから入力し、次にそれらの行列の積を計算して二次元配列zに代入し、行列x,y,zの要素を出力せよ。但し、配列の大きさは最初にキーボードから入力しておき、変数宣言においては、配列の大きさを大きめに宣言しておき、キーボードから入力する配列の大きさはその範囲内で入力するようにせよ。 という問題です。よろしくお願いいたします

このQ&Aのポイント
  • 光テレビをご利用の際、専用チューナーからの接続方法は必要ですか?LANポートにLANケーブルを接続するだけでも大丈夫でしょうか?
  • ひかりTVサービスやISPぷららをご利用の方にお伝えします。光テレビの接続方法についてご説明します。
  • 光テレビを正しく接続するためには、専用チューナーを使用してONU本体に有線接続する必要があります。LANポートだけでなく、専用チューナーを使用することで光テレビの機能をフルに活用できます。
回答を見る

専門家に質問してみよう