创建基本的简单树

Posted

技术标签:

【中文标题】创建基本的简单树【英文标题】:Creating the basic simple Tree 【发布时间】:2021-12-19 07:40:53 【问题描述】:

我正在创建创建节点及其子节点的基本树。但是在使用 print() 语句时出现错误,即 __ str __( ) 在下面的代码中打印出树布局。

class TreeNode:
    def __init__(self,data,children = []):
        self.data = data
        self.children = children
    

    def __str__(self,level=0):
        ret = " " * level + str(self.data) + '\n'
        for child in self.children:
           ret += child.__str__(level+1)
    
        return ret

    # adding the children to the tree node
    def addchildren(self,TreeNode):
        self.children.append(TreeNode.data)

drinks = TreeNode('Drinks',[])
cold = TreeNode('Cold',[])
hot = TreeNode('Hot',[])
cola = TreeNode('Cola',[])
cappucino = TreeNode('Cappucino',[])
drinks.addchildren(cold)
drinks.addchildren(hot)
cold.addchildren(cola)
hot.addchildren(cappucino)

print(drinks)

TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_944/4195955341.py in <module>
----> 1 print(drinks)

~\AppData\Local\Temp/ipykernel_944/3676504849.py in __str__(self, level)
      8         ret = " " * level + str(self.data) + '\n'
      9         for child in self.children:
---> 10             ret += child.__str__(level+1)
     11 
     12         return ret

TypeError: expected 0 arguments, got 1

为什么会抛出这个 TypeError?解决方案是什么? 我期待这个:

Drinks
 Cold
  Cola
 Hot
  Cappucino

还有一件事,请解释一下def __str__(self,level=0): 方法,尤其是child.__str__(level_1),因为我借用了这个打印声明。

【问题讨论】:

您正在附加TreeNode.data,它不是树节点,所以它是__str__ 不采用level=0 参数,不应将__str__ 定义为放在第一位 【参考方案1】:

您的addchildren 方法已损坏,应将TreeNode 添加到self.children,而不是TreeNode.data

def addchildren(self,TreeNode):
        self.children.append(TreeNode)

TypeError 是由ret += child.__str__(level+1) 引起的,如果self.children 中的每个子节点也是TreeNode 类的实例,则它意味着递归打印子节点。但它失败并导致TypeError,因为TreeNode.data 被添加为孩子之一。

正如错误消息TypeError: expected 0 arguments, got 1 所示,它试图为TreeNode.data 调用__str__ 方法,这是内置类str 的一个实例,默认情况下不带任何参数。因为用户自定义类TreeNode__str__方法被覆盖了,但是内置的str类没有。

因此它与调用'Cold'.__str__(level+1) 相同,默认情况下不期望任何参数。

object.str(自我) 由 str(object) 和内置函数 format() 和 print() 调用,以计算对象的“非正式”或可良好打印的字符串表示。返回值必须是字符串对象。 -- Python3 Reference

注意self 不算作参数(至少不在错误消息中),它只是一个约定,每个类方法需要将对象的引用作为参数中的第一个列表。

【讨论】:

知道了。请解释 def __str__() 方法,尤其是。 child.__str__(level+1)。为什么它会抛出这个拼写错误? 查看上面修改后的答案。

以上是关于创建基本的简单树的主要内容,如果未能解决你的问题,请参考以下文章

kettle基本使用

哈夫曼树(最优二叉树)的创建

使用双指针创建树

二叉树的创建和简单操作;前序中序后续,层序遍历。

二叉树的创建和简单操作;前序中序后续,层序遍历。

算法设计(综合)博弈树的了解与创建