Может ли обход дерева "принести код" вернуть вместо этого? - PullRequest
0 голосов
/ 12 апреля 2020

Так как я всегда видел коды обхода дерева, печатающие данные внутри дерева. Я начал задаваться вопросом, возможно ли создать функцию, которая возвращает мне данные, а не печатает их. Я пытался реализовать свои мысли, пытаясь манипулировать функцией печати «Custom made», изменяя печать на возвратную. однако, поскольку была рекурсия, все стало грязно, и это не сработало, как я хотел. Поэтому я попытался создать self.list = [], а затем добавить в него каждый узел и его данные. он также не работал с использованием рекурсии.

это код, который я пробовал:

    class BinaryTree():
        def __init__(self, item,value):

            self.left = None
            self.right = None
            self.item = item
            self.value = value

            self.list=[]

        def insert(self, item,value):
            if self.value:
                if value < self.value:
                    if self.left is None:
                        self.left = BinaryTree(item,value)
                    else:
                        self.left.insert(item,value)


                elif value > self.value:
                    if self.right is None:
                        self.right = BinaryTree(item,value)
                    else:

                        self.right.insert(item,value)

                elif value == self.value:
                    if self.left is None:
                        self.left = BinaryTree(item,value)
                    else:
                        self.left.insert(item,value)
            else:
                self.item=item
                self.value=value


        def PrintTree(self):

            if self.right:
                self.right.PrintTree()
            print(["item : " + self.item, "value : " + self.value]),

            if self.left:
                self.left.PrintTree()


        #Custom made functions

        def print(self):
            if self.right:
                self.right.print()
            new = {self.item,self.value}
            self.list.append(new)
            print(self.list)
            if self.left:
                self.left.print() 


Root = BinaryTree('car', 18 )
Root.insert('truck',23)
Root.insert('airplane',99)
Root.insert('bus',17)

Root.print() # during recursion gives me everything, however the items are not saved permanently in self.list
print("\n")
print(Root.list) # should give me everything, but gives me only root.

Он должен добавлять все в список, а не заменять их. буду признателен за помощь

1 Ответ

0 голосов
/ 12 апреля 2020

Вместо построения списка вы можете yield from рекурсию. Это делает все очень легко читать и понимать. В конце просто оберните это в list(), если вы хотите список, а не генератор:

     def traverse(self):
            if self.right:
                yield from self.right.traverse()
            yield (self.item, self.value)
            if self.left:
                yield from self.left.traverse()


Root = BinaryTree('car', 18 )
Root.insert('truck',23)
Root.insert('airplane',99)
Root.insert('bus',17)

list(Root.traverse())
# [('airplane', 99), ('truck', 23), ('car', 18), ('bus', 17)]

Если вы хотите вернуть список непосредственно из метода, очевидно, вы можете обернуть это и вернуть список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...