Python 按预定顺序打印BST

Python 按预定顺序打印BST,python,python-2.7,data-structures,Python,Python 2.7,Data Structures,我试图打印出我的二叉树在预订单的形式,但我遇到这些错误。我仍在学习python,所以我不太清楚到底发生了什么。但是我假设我的打印功能不能正常工作。不太清楚为什么preorder_print会有一个全局名称问题=/ 输出: >>> from BST_tree import * pre order: <BST_tree.Node instance at 0x0000000002AA0C88> Traceback (most recent call last): F

我试图打印出我的二叉树在预订单的形式,但我遇到这些错误。我仍在学习python,所以我不太清楚到底发生了什么。但是我假设我的打印功能不能正常工作。不太清楚为什么preorder_print会有一个全局名称问题=/

输出:

>>> from BST_tree import *
pre order:
<BST_tree.Node instance at 0x0000000002AA0C88>

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    from BST_tree import *
  File "BST_tree.py", line 51, in <module>
    preorder_print(r)
  File "BST_tree.py", line 27, in preorder_print
    preoder_print(root.left)
NameError: global name 'preoder_print' is not defined
来自BST_树导入的
>>*
预购:
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
从BST_树导入*
文件“BST_tree.py”,第51行,在
预订单打印(r)
文件“BST_tree.py”,第27行,预订单打印
预订单打印(根目录左)
名称错误:未定义全局名称“预订单打印”
我的代码:

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:
        preoder_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)
类节点:
定义初始值(自身,值):
self.right=无
self.left=无
自我价值=价值
def BST_Insert(根,节点):#根-->树或子树的根!
如果root.value为无:
根=节点#树的开头
其他:
如果root.value>node.value:#向左
如果root.left为无:
root.left=节点
其他:
BST_插入(root.left,节点)
其他:
如果root.value
这是一个简单的输入错误:您定义了
预订单打印
,但试图调用
预订单打印

当您看到这样的错误消息时:

NameError: global name 'preoder_print' is not defined
…不要太担心“全球”部分。问题是名称没有在任何地方定义,甚至在全局中也没有定义。*所以,开始寻找为什么没有定义它

这样的输入很容易,所以我通常首先检查:从错误消息中复制字符串,然后将其粘贴到搜索中



*这有点过于简单,但现在已经足够好了。这实际上意味着,首先编译器在编译时找不到它作为本地名或闭包名,因此假定它是全局名,然后解释器在运行时找不到它作为全局名或内置名。

谢谢,这清楚地消除了所有错误!但是,我的逻辑现在不正确=/I插入了root和其他6个节点,但打印只显示了3段我不理解的代码。可能是每个物体的位置。预购:@Liondancer:我不确定我是否理解你的新问题。是否只是您希望这些文件以更好的格式打印出来,例如,
Node(4)
?如果需要,您需要显式打印所需内容,而不是只打印对象本身,或者需要为对象提供一个
\uuuu repr\uuuu
方法。我编辑了该问题以解决我遇到的打印问题。谢谢你指出那个打字错误!非常感谢!这确实是一个与原始问题不同的问题,最好创建一个新问题,而不是继续编辑同一个问题,直到所有问题都得到解决。是的,很抱歉,您指出的打字错误修复了所有错误,现在唯一的问题是我的打印功能。我想我可以提出另一个问题