質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1932閲覧

ポーランド記法で書かれた数式を木構造にしたい

milano

総合スコア14

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2020/05/24 13:16

Pythonでポーランド記法で++243のように書かれたものを二分木の木構造にするプログラムを作りたいのですが、それを行うためのライブラリはありますか?それとも自分で作る必要がありますか?
漠然とした質問ですみませんが、よろしくお願いします。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

自分でやってもしれてます。

Python

1from collections import deque 2 3deque = deque('++243') 4 5def isBinaryOperator(token): 6 if token == '+': 7 return True 8 else: 9 return False 10 11def convert(): 12 token = deque.popleft() 13 if isBinaryOperator(token): 14 return (token, convert(), convert()) 15 else: 16 return (token) 17 18print(convert()) 19

上記コードの convert 関数は要素数三つのタプルを返します。最初の要素が親、次の要素が左の子、最後の要素が右の子です。
実行結果は次のようになります。

('+', ('+', '2', '4'), '3')

ルートが '+' で、その左の子が ('+', '2', '4') 右の子が '3' です。
('+', '2', '4') は親が '+' で左の子が '2' 右の子が '4' です。
これをタプルでなくノードクラスを作れば木構造のできあがりです。

投稿2020/05/24 14:19

Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

milano

2020/05/24 23:21

ありがとうございます。このように表すことを考えてもいませんでした。タプルで木構造を表すことについてもっと詳しくお聞きしたいことがあります。++243においての木構造のノードのleftとrightとparentはどのように調べればよいですか?つまり++243の2番めの+のparentは+,leftは2,rightは4という感じでです。よろしくお願いいたします。
Zuishin

2020/05/24 23:24

まずその前に、私の書いたコードの意味が全部わかりますか?
milano

2020/05/25 01:04

分かります
Zuishin

2020/05/25 01:20

だとすると、何を聞かれているのかよくわからないんですが、どういうことでしょう?
Zuishin

2020/05/25 01:45

(A, B, C) は A の子として B と C があるという意味です。 ('+', ('+', '2', '4'), '3') では '+' が A にあたり、('+', '2', '4') が B にあたり、'3' が C にあたります。 こういうことですか?
milano

2020/05/25 03:09

何回も親切にコメントをしていただき本当にありがとうございます。再帰をすることはわかるのですが、例えば二番目の+について[node.parent,node.left,node.right]を出力するにはタプルで表された木構造ではどうすればいいですか?
Zuishin

2020/05/25 03:12

回答にも書きましたが、タプルではなくクラスを作ってください。出力に関してもそうですが、その他の使い勝手も上がるでしょう。
Zuishin

2020/05/25 03:41 編集

もし「出力」ではなく「解析」のことだとすれば、御覧の通り解析のできる非常に短いコードを示したので、それを追ってみれば、言葉で説明されるよりもわかりやすいのではないかと思います。 > まずその前に、私の書いたコードの意味が全部わかりますか? に対して > 分かります という返事が返ってきたので、解析のことではないと思いますが、念のため。
milano

2020/05/25 03:51

要するに、クラスでやるしか方法がないということですね。ありがとうございます。
Zuishin

2020/05/25 03:53

できないことはありませんが、タプルでは機能が足りていないので作りにくいと思います。ここでタプルを使ったのは単にロジックを示すだけならタプルで十分だったからです。
milano

2020/05/25 05:44

わかりました。丁寧にしていただきありがとうございます。
guest

0

https://smdn.jp/programming/tips/polish/impl_python/
は、中間記法から内部的に二分木を生成し、逆ポーランド記法で表示し、計算するプログラムですので、参考になると思います。

二分木化の基本的な考え方は
https://smdn.jp/programming/tips/polish/
に図解で記載されています。

投稿2020/05/24 13:21

編集2020/05/24 13:39
patapi

総合スコア820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2020/05/24 13:29

ソレ、中置:2+4+3 を 逆ポーランド:243++ に変換するヤツちゃいます?
patapi

2020/05/24 13:33

ご指摘ありがとうございます。修正します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問