我正在尝试以预订形式打印出我的二叉树,但是我遇到了这些错误。我还在学习python,所以我不太确定发生了什么。但我认为我的打印功能无法正常工作。不太清楚为什么preorder_print有一个全局名称问题= =
我的预期输出是
pre order:
4
2
1
3
8
6
10
输出:
pre order:
<BST_tree.Node instance at 0x0000000002AA0988>
<BST_tree.Node instance at 0x0000000002AA0E08>
<BST_tree.Node instance at 0x0000000002AA0E88>
我的代码:
class Node:
def __init__(self,value):
self.right = None
self.left = None
self.value = value
def BST_Insert(root, node): # root --> root of tree or subtree!
if root.value is None:
root = node # beginning of tree
else:
if root.value > node.value: # go to left
if root.left is None:
root.left = node
else:
BST_Insert(root.left, node)
else:
if root.value < node.value: # go to right
root.right = node
else:
BST_Insert(root.right, node)
def preorder_print(root):
print root
if root.left is not None:
preorder_print(root.left)
else:
if root.right is not None:
preorder_print(root.right)
r = Node(4)
# left
a = Node(2)
b = Node(1)
c = Node(3)
# right
d = Node(8)
e = Node(6)
f = Node(10)
BST_Insert(r, a)
BST_Insert(r, b)
BST_Insert(r, c)
BST_Insert(r, d)
BST_Insert(r, e)
BST_Insert(r, f)
print "pre order:"
preorder_print(r)
*编辑*
谢谢大家,特别是 abarnert 的帮助!这是固定版本!或preorder_print和BST_Inert
def BST_Insert(root, node): # root --> root of tree or subtree!
if root.value is None:
root = node # beginning of tree
else:
if root.value > node.value: # go to left
if root.left is None:
root.left = node
else:
BST_Insert(root.left, node)
if root.value < node.value: # go to right
if root.right is None:
root.right = node
else:
BST_Insert(root.right, node)
def preorder_print(root):
print root.value
if root.left is not None:
preorder_print(root.left)
if root.right is not None:
preorder_print(root.right)
答案 0 :(得分:1)
打印功能正常。当您打印出没有自定义__repr__
或__str__
方法的对象时,这正是您应该得到的。
有两种方法可以解决这个问题。
首先,打印您要打印的信息,而不是打印Node
对象本身。例如,更改此:
print root
......来:
print 'node with value {}'.format(root.value)
......或:
print root.value
......或:
print 'I've got a node and he's got a value and it's ' + str(root.value)
或者,如果您始终希望节点以相同的方式打印 - 例如,Node(4)
- 您可以为该类提供__repr__
方法:
def __repr__(self):
return 'Node({})'.format(self.value)
有时候,您希望提供一个可以放入报表中的类的人类可读表示,以及一个对于例如在交互式解释器上进行实验有用的不同表示。在这种情况下,您可以定义__str__
和__repr__
:
def __str__(self):
# Pick whatever you think looks nice here
return str(self.value)
# return 'Node: ' + str(self.value)
# return 'Node with value {}'.format(self.value)
def __repr__(self):
return 'Node({})'.format(self.value)
(请注意Node(4)
是一个很好的“在交互式解释器中进行实验”表示,因为它正是您在解释器中键入的内容,用于创建等效对象。)
答案 1 :(得分:1)
使用print root.value
代替print root
。
说明:
root
是一个对象,是Node
类的一个实例。 root.value
是节点持有的实际数字。
除此之外:@abarnert通过__repr__
回答了“正确”的做法,但对于围绕树木教学的简单练习来说,这有点过分。
答案 2 :(得分:1)
您想要打印root
的值print root.value
答案 3 :(得分:1)
发表两个答案的道歉,但我不确定你在这里问的两个问题中的哪一个。
您的前序遍历并未覆盖整个树,因为只要左子树不为空,您就会忽略整个右子树:
def preorder_print(root):
print root
if root.left is not None:
preoder_print(root.left)
else:
if root.right is not None:
preorder_print(root.right)
因此,在您的示例中,由于4
节点左侧有2
节点,因此它不会查看8
或其下的任何内容。然后是2
中的同样的事情。因此,您只能获得3个节点,而不是全部7个节点。
要解决此问题,请删除else
:
def preorder_print(root):
print root
if root.left is not None:
preoder_print(root.left)
if root.right is not None:
preorder_print(root.right)
您的BST_Insert
功能也存在问题。您随时root.right = node
设置node.value > root.value
,即使已存在某些内容。因此,当您第一次尝试插入任何内容左侧的内容时,它会删除父级 - 6
删除8
,然后10
删除6
,所以你最终只得到4分,2分,1分,3分和10分。
我认为你想要的是改变这个:
else:
if root.value < node.value: # go to right
root.right = node
else:
BST_Insert(root.right, node)
......来:
elif root.value < node.value: # go to right
if root.right is None
root.right = node
else:
BST_Insert(root.right, node)