1. ホーム
  2. python

[解決済み] self.xxxxをデフォルトのパラメータとして使用する - Python

2023-08-29 21:50:16

質問

私は宿題のひとつを単純化し、コードを少し良くしようとしています。私が取り組んでいるものは、バイナリ検索ツリーです。今、私は私の中の関数を持っています Tree() クラスに関数があり、すべての要素を見つけてリストに入れます。

tree = Tree()
#insert a bunch of items into tree

で、makeList()関数を使って、ツリーからすべてのノードを取り出して、リストに格納しています。 この関数を呼び出すには makeList() 関数を呼び出すには、次のようにします。 tree.makeList(tree.root) . 私には、これは少し繰り返しに見えます。私はすでにツリーオブジェクトを tree. でツリーオブジェクトを呼び出しているので tree.root はちょっとしたタイピングの無駄でしかありません。

今現在のmakeListの関数は。

    def makeList(self, aNode):
        if aNode is None:
            return []
        return [aNode.data] + self.makeList(aNode.lChild) + self.makeList(aNode.rChild)

のように、aNodeの入力をデフォルトのパラメータにしたい。 aNode = self.root (これは動作しません)そうすれば、私はこれで関数を実行することができます。 tree.makeList() .

最初の疑問は、なぜそれがうまくいかないのか、ということです。

第二の質問は、それが機能する方法があるかどうかです。ご覧のように makeList() 関数は再帰的なので、関数の最初に何かを定義することはできませんし、無限ループになります。

EDIT 要求されたすべてのコードはここにあります。

class Node(object):
    def __init__(self, data):
        self.data = data
        self.lChild = None
        self.rChild = None

class Tree(object):
    def __init__(self):
        self.root = None

    def __str__(self):
        current = self.root

    def isEmpty(self):
        if self.root == None:
            return True
        else:
            return False

    def insert (self, item):
        newNode = Node (item)
        current = self.root
        parent = self.root

        if self.root == None:
            self.root = newNode
        else:
            while current != None:
                parent = current
                if item < current.data:
                    current = current.lChild
                else:
                    current = current.rChild

            if item < parent.data:
                parent.lChild = newNode
            else:
                parent.rChild = newNode

    def inOrder(self, aNode):
        if aNode != None:
            self.inOrder(aNode.lChild)
            print aNode.data
            self.inOrder(aNode.rChild)

    def makeList(self, aNode):
        if aNode is None:
            return []
        return [aNode.data] + self.makeList(aNode.lChild) + self.makeList(aNode.rChild)


    def isSimilar(self, n, m):
        nList = self.makeList(n.root)
        mList = self.makeList(m.root) 
        print mList == nList 

どのように解決するのですか?

ラースマン 回答済み 最初の質問

2番目の質問については、再帰を避けるために、跳ぶ前に見ることができますか?

def makeList(self, aNode=None):
    if aNode is None:
        aNode = self.root
    treeaslist = [aNode.data]
    if aNode.lChild:
        treeaslist.extend(self.makeList(aNode.lChild))
    if aNode.rChild:
        treeaslist.extend(self.makeList(aNode.rChild))
    return treeaslist