1

私はPython3でバイナリツリーに取り組んでいますが、これまでのところほとんどすべてが期待どおりに機能しています。ただし、特定のノードのすべての子のリストを返す関数があり、何らかの理由でオブジェクトアドレスのリストのみを取得し、オーバーライドされ__str__(self)たメソッドを呼び出していません。

from collections import deque  # http://docs.python.org/3.1/tutorial/datastructures.html

class BinaryNode:  # binary tree functionality via iterative means

    def __init__(self, name, data):
        self.Left = None
        self.Right = None
        self.Parent = None
        self.Name = name
        self.Data = data
        return

    def AddNew(self, name, data):
        q = []
        q.append(self)
        while q:
            i = q.pop()
            if i.Name == name:
                i.Data = data
                return i
            elif name < i.Name:
                if i.Left:
                    q.append(i.Left)
                else:
                    i.Left = BinaryNode(name, data)
                    i.Left.Parent = i
                    return i.Left
            else:
                if i.Right:
                    q.append(i.Right)
                else:
                    i.Right = BinaryNode(name, data)
                    i.Right.Parent = i
                    return i.Right

    def Find(self, name):
        q = deque()
        q.append(self)
        '''if self.Left: q.append(self.Left)
        if self.Right: q.append(self.Right)'''
        while q:
            i = q.pop()
            print(i)
            if i.Name == name:
                return i
            elif name < i.Name:
                if i.Left: q.append(i.Left)
                else: return None
            else:
                if i.Right: q.append(i.Left)
                else: return None

    def Children(self):
        children = []
        q = deque()
        if self.Left: q.append(self.Left)
        if self.Right: q.append(self.Right)
        while q:
            i = q.popleft()
            if i.Left: q.append(i.Left)
            if i.Right: q.append(i.Right)
            children.append(i)
        return children

    def Parents(self):
        lst = []
        i = self.Parent
        while i is not None:
            lst.append(i)
            i = i.Parent
        return lst

    def __str__(self): return "{} : {}".format(self.Name, self.Data)

そして、私はそれを呼び出してテストしています

test = BinaryNode("Jesse", 21)
print(test)
print(test.AddNew("David", 22))
print(test.AddNew("Marli", 23))
print(str(test.Children()))
print(test.Find("David"))
print(test.Find("David").Children())
print(test.Find("Gary")) #Will return None

結果のコンソール出力

Jesse : 21
David : 22
Marli : 23
[<__main__.BinaryNode object at 0x000000000333E160>, <__main__.BinaryNode object at 0x000000000333E1D0>, <__main__.BinaryNode object at 0x000000000333E198>]
David : 22
[<__main__.BinaryNode object at 0x000000000333E1D0>]
None

更新: これが私が実装した答えです:

def __repr__ (self): return str(self)
4

1 に答える 1

3

Python コンテナーは常に、含まれているオブジェクトの表現を使用します。

リストを印刷するときに使用されるメソッドも実装__repr__します。__str__必要に応じて、次のエイリアスにすることができます。

 __repr__ = __str__

または、リスト内の各要素を明示的に出力します。

print(', '.join(map(str, test.Children())))
于 2013-10-15T09:47:39.773 に答える