【问题标题】:Can tree traversal "print code" return instead?树遍历“打印代码”可以返回吗?
【发布时间】:2020-04-12 17:22:45
【问题描述】:

因为我总是看到树遍历代码打印树内的数据。我开始想知道是否有可能创建一个函数,它将数据返回给我,而不是打印它。 当我试图通过将打印更改为返回来操作打印“定制”功能时,我试图实现我的想法。然而,由于存在递归,事情变得一团糟,它没有按我的意愿工作。 所以我尝试制作一个 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.

它应该将所有内容附加到列表中,而不是替换它们。感谢您的帮助

【问题讨论】:

    标签: python data-structures nodes recursive-datastructures


    【解决方案1】:

    你可以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)]
    

    如果你想直接从方法中返回一个列表,显然你可以把它包装起来返回一个列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      • 2021-05-04
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 2014-05-07
      相关资源
      最近更新 更多