我正在编写一个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()
答案 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个修复后,代码最终会输出预期的缩进显示。