• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:二分木について)

二分木について

このQ&Aのポイント
  • 二分木についての要約文1。
  • 二分木についての要約文2。
  • 二分木についての要約文3。

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

  • ベストアンサー
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.2

普通の、中置記法から逆ポーランド記法への、変換法が載っているページがいくつかあると思うので、 見てみるとよいと思うのですが、LALR1文法と思ってスタックを使って変換すると、実はカッコの処理もたいして大変ではなかったりします。 頭いい方法ですね。

noname#16581
質問者

お礼

一応できたつもりでしたが、 重大な論理エラーがありました。 括弧の内部をツリー化して、その外枠の演算子とノード化するときに、 その大内の括弧は数値のように振舞わないといけないことが解りました。 ご報告いたします。 このプログラムは、現在修正中です。

noname#16581
質問者

補足

とりあえずできました。 ノードの情報を増やしました。括弧に対応するためです。 struct NODE { NODE *Parent; NODE *Left; NODE *Right; NODE *xArrayNext; NODE *xArrayPrev; char Code; int Priority; int StringCount;//usedebug }; 括弧なしの四則演算は簡単でした。 xArrayNext、xArrayPrevは、 ((1+2*3)*(5-4)) 内の一文字をそれぞれ順番に格納していき、 ある一文字の次のノード、前のノードです。 一番深い括弧の中のノードをまずツリー化して、 得られたトップノードのxArrayNext、xArrayPrevを括弧の前後にくっつけて、Priorityを(と同じにする。 そして、再計算(繰り返し、)しました。 ありがとうございました。

その他の回答 (1)

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

仰るとおり、普通はスタック(+1文字先読み)を使って処理します。 「逆ポーランド記法 変換 スタック」 とかで検索すれば、大量に情報が出てくるかと。 他の方法でもがんばれば出来るかもしれませんが、スタックを使う処理より早くできるとは思えません。

noname#16581
質問者

補足

ありがとうございました。 今は、とりあえず、 struct NODE { NODE *Left; NODE *Right; NODE *Parent; char Code; int Cnt; }; という構造体を式の長さの数だけ作成して、 Codeのところに、「1」「2」「+」「*」などを順番に格納しています。 肝心なのは、+-*/演算子なのでそれを連結していき、 あまったところへ、数値文字を連結していくというやり方で作成中です。()についてはまだ考慮に入れていません。 前途多難ですが、何とかやってみようと思います。

関連するQ&A