Python:TypeError无法连接'str和'list'对象

时间:2017-10-14 16:49:29

标签: python binary-tree typeerror

我正在编写一个python脚本来创建二叉树,当我使用教授的示例代码根据节点的位置打印树的“分支”时,我一直收到TypeError: cannot concatenate 'str' and 'list' objects

    def print_node(self, depth):
        print('---' * depth + self.key)
        if self.left_child is not None:
            self.left_child.print_node(depth + 1)
        if self.right_child is not None:
            self.right_child.print_node(depth + 1)

但是,我修改了我在其他地方找到的二叉树的代码,它仍然不起作用,但它也没有抛出使用教授代码时得到的TypeError。因此,我很困惑导致错误抛出的问题是什么。

完整代码:

class BinaryTreeNode():
    def __init__(self, key):
        self.key = key
        self.left_child = None
        self.right_child = None

    def print_node(self, depth):
        print('---' * depth + str(self.key))
        if self.left_child is not None:
            self.left_child.print_node(depth + 1)
        if self.right_child is not None:
            self.right_child.print_node(depth + 1)

    def insert_node(self, newNode):
        if newNode == self.key:
            return False
        elif newNode < self.key:
            if self.left_child:
                return self.left_child.insert_node(newNode)
            else:
                self.left_child = BinaryTreeNode(newNode)
                return True
        else:
            if self.right_child:
                return self.right_child.insert_node(newNode)
            else:
                self.right_child = BinaryTreeNode(newNode)
                return True

class BinaryTree():
    def __init__(self):
        self.root = None

    def insert(self, k):
        if self.root:
            return self.root.insert(k)
        else:
            self.root = BinaryTree(k)
            return True

    def print_tree(self):
        self.root.print_node(k)

if __name__ == '__main__':
    tree = BinaryTree()
    tree.insert(5)
    tree.insert(28)
    tree.insert(17)
    tree.insert(22)
    tree.insert(229)
    tree.insert(222)
    tree.insert(2)
    tree.print_tree()

预期的结果应该是打印的二进制树:

5
---2
---28
-----17
-------22
----------21
------229
--------222

修改

Traceback (most recent call last):
  File "G:/Programming Projects/BinaryTree.py", line 48, in <module>
    tree.print_tree()
  File "G:/Programming Projects/BinaryTree.py", line 37, in print_tree
    self.root.print_node(0)
  File "G:/Programming Projects/BinaryTree.py", line 10, in print_node
    print('---' * depth + self.key)
TypeError: cannot concatenate 'str' and 'list' objects

修改后的“工作”代码:

class Node():

    def __init__(self,val):
        self.value = val
        self.left_child = None
        self.right_child = None

    def print_node(self, depth):
        print('---' * depth + self.value)
        if self.left_child is not None:
            self.left_child.print_node(depth + 1)
        if self.right_child is not None:
            self.right_child.print_node(depth + 1)

    def _insert(self,data):
        if data == self.value:
            return False
        elif data < self.value:
            if self.left_child:
                return self.left_child._insert(data)
            else:
                self.left_child = Node(data)
                return True
        else:
            if self.right_child:
                return self.right_child._insert(data)
            else:
                self.right_child = Node(data)
                return True

    def _inorder(self):
        if self:
            if self.left_child:
                self.left_child._inorder()
            print(self.value)
            if self.right_child:
                self.right_child._inorder()



class Tree():

    def __init__(self):
        self.root = None

    def insert(self,data):
        if self.root:
            return self.root._insert(data)
        else:
            self.root = Node(data)
            return True
    def inorder(self):
        if self.root is not None:
            return self.root._inorder()
        else:
            return False

if __name__=="__main__":
    a = Tree()
    a.insert(5)
    a.insert(28)
    a.insert(17)
    a.insert(22)
    a.insert(229)
    a.insert(222)
    a.insert(2)
    a.inorder()

1 个答案:

答案 0 :(得分:2)

if ( ! (is_single( array( 10 , 200 )) || is_page( array( 5 , 77 ))) ) { 方法中有一个错误:

BinaryTree.insert()

此代码忽略 def insert(self, k): if self.root: return self.root.insert_node(newNode) else: self.root = BinaryTreeNode(newNode) return True 参数,并使用全局k代替。该值设置为列表:

newNode

因此,这会创建将newNode = [] 属性设置为空列表的节点,这会打破key函数假设print_node()始终为字符串。

要使代码生效,您需要进行两次更改:

  • 修复插件以使用self.key代替k

    newNode
  • 在连接到def insert(self, k): if self.root: return self.root.insert_node(k) else: self.root = BinaryTreeNode(k) return True 之前将self.key转换为字符串,或者仅在树中使用字符串值。转换为字符串更灵活:

    '---' * depth

请注意,print('---' * depth + str(self.key)) 方法也不完整;没有代码处理插入 right 子树;只处理BinaryTreeNode.insert_node()newNode == self.key个案,省略newNode < self.key个案,如果添加了新节点,则可能会返回newNode > self.key

True

应用这3个修复后,代码最终会输出预期的缩进显示。