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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1129閲覧

python classの使い方

NR4200

総合スコア41

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/10/29 12:51

前提・実現したいこと

2分探索木をpythonで実装しようと考えています.
とりあえず,ネットに落ちていたものをベースにしようと考えていしたが,

プログラム内self.insert() (Solutionクラスのinsert関数内)とroot.left(Solutionクラスのinsert関数内)が何を表しているのかがわかりません.

selfがつくのはインスタンス変数などを呼び出すときに使用する時なのでは
またroot.leftは,rootをインスタンス化しなければつかえないのでは

発生している問題・エラーメッセージ

エラーは出ていません

該当のソースコード

python

1class Node: 2 def __init__(self,data): 3 self.right=self.left=None 4 self.data = data 5 6class Solution: 7 def insert(self,root,data): 8 if root==None: 9 return Node(data) 10 else: 11 if data<=root.data: 12 cur=self.insert(root.left,data) 13 root.left=cur 14 else: 15 cur=self.insert(root.right,data) 16 root.right=cur 17 return root 18 19 def getHeight(self,root): 20 if root == None: 21 return -1 22 return 1 + max(self.getHeight(root.left), self.getHeight(root.right)) 23 24T=int(input()) 25myTree=Solution() 26root=None 27for i in range(T): 28 data=int(input()) 29 root=myTree.insert(root,data) 30height=myTree.getHeight(root) 31print(height)

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

selfがつくのはインスタンス変数などを呼び出すときに使用する時なのでは

そんなことはありません。
スタティックメソッドやプロパティは、インスタンス化(初期化)せずとも、そのまま使用できます。

ただし、今回の構文は初期化を行っています
故に、selfはインスタンスのアクセサとして機能しています。

またroot.leftは,rootをインスタンス化しなければつかえないのでは

上記記載のように、今回の構文はインスタンス化を行っています。

プログラム内self.insert() (Solutionクラスのinsert関数内)とroot.left(Solutionクラスのinsert関数内)が何を表しているのかがわかりません.

上記を踏まえて、下記で何をしているかのコメントを記述してみました。

python

1class Node: 2 def __init__(self,data): 3 # ただ単に、Nodeクラスの初期化 4 self.right=self.left=None 5 self.data = data 6 7class Solution: 8 def insert(self,root,data): 9 if root==None: 10 # rootがNoneだった場合は、Nodeクラスを初期化して、返す 11 # 最初は、rootにNoneを代入して実行しているため、一発目はここを通る 12 return Node(data) 13 else: 14 # rootに既に値が入っているため、様々処理を行う 15 if data<=root.data: 16 # 同クラスの同メソッドを改めて実行して再計算させている。 17 # これを"再帰的処理"と言い、何回計算させるかわからない時や、深く処理を潜らせなければならない時に用いる処理法 18 cur=self.insert(root.left,data) 19 root.left=cur 20 else: 21 # 上記と同様に、再帰的処理を行っている 22 cur=self.insert(root.right,data) 23 root.right=cur 24 # 処理を行ったNodeインスタンスを返す 25 return root 26 27 def getHeight(self,root): 28 # rootの情報を使って、高さを返している 29 if root == None: 30 return -1 31 return 1 + max(self.getHeight(root.left), self.getHeight(root.right)) 32 33# inputの実行値を整数に変換しTに格納 34T=int(input()) 35 36# Solutionクラスを初期化し、myTreeに格納 37myTree=Solution() 38 39# rootにNoneを格納(最初は値がないことを示したいと思われる) 40root=None 41 42# Tの回数だけfor処理を実行 43for i in range(T): 44 # dataに、inputの実行値を整数に変換し、格納 45 data=int(input()) 46 47 # rootに、myTree(Solutionクラス)のinsertメソッドの返却値を代入 48 # insertメソッドは、引数がNoneだった場合は、Nodeクラスを初期化したインスタンスを返し、値が入っていれば、様々処理をした上で、Nodeのインスタンスを返す 49 root=myTree.insert(root,data) 50 51# root(Nodeのインスタンス)を使って、高さを取得している 52height=myTree.getHeight(root) 53 54# 上記を表示 55print(height)

以上です。
参考になれば幸いです。

どこをどういう順番で通るか、を意識して見ていくといいかと。

投稿2020/10/29 13:28

編集2020/10/29 14:03
miyabi_takatsuk

総合スコア9528

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

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

miyabi_takatsuk

2020/10/29 14:03

間違った・・・。 ご指摘ありがとうございます。
NR4200

2020/10/29 14:30

丁寧なご回答ありがとうございます. root.leftのところで質問なのですが, class内でないところで, root=myTree.insert(root,data) と記述することによって, rootがインスタンス化され,classないで,root.leftが使えるという認識でいいのでしょうか?
miyabi_takatsuk

2020/10/29 15:28 編集

うーん、結果的には間違っていないのですが、 正確には、 insertメソッドが、 Nodeのインスタンスを返すようになっており、 その値がrootに代入されているだけです。 return文をしっかり学習してください。 それを、再帰実行で、再度引数に入れて実行することで、 rootの値を引き継いで再計算しています。 ですが、外側のrootと、insertメソッド内のrootは同値ですが、 まったく別物という認識は忘れずに。 つまり、厳密に言えば、 > rootがインスタンス化され という認識は間違っています。 あくまで、外側のrootには、insertメソッドから返された値が代入されているだけです。
NR4200

2020/10/30 12:37

何度も質問して申し訳ございません。 一回目のinsertメソッドでのreturnで rootという名前の<Node>classのインスタンス化をつくる. 二回目以降で,インスタンス化した<Node>classのrootのインスタンス変数を変更している? もし上記の考えがあっているならば, 二回目以降のmyTree.insert(root,data)の引数rootは,<Node>classのインスタンス化したものが引数として渡されている.
miyabi_takatsuk

2020/10/31 17:20

その解釈であっていると思います。
NR4200

2020/11/01 04:35

丁寧な解説,ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問