class Node:
"""A Tree Node with 3 attributes: l_child, r_child and data"""
def __init__(self, val):
self.data = val
self.l_child = None
self.r_child = None
class BST(object):
"""Implement a Binary Search Tree class"""
def __init__(self):
self.root = None
print "Initial root", self.root
def insertRecur(self, node, data):
if node is None:
node = Node(data)
else:
if data < node.data:
insertRecur(node.l_child, data)
if data > node.data:
insertRecur(node.r_child, data)
def Insert(self, data):
self.insertRecur(self.root, data)
抱歉,伙计们 这就是我原来的代码。我想用Python实现一个二叉搜索树类。我想这样做
test = BST()
test.Insert(1)
print test.root
以及测试根是None
只需将
self.data
的值赋给node
,而不是variable self.data
本身。您在Insert
函数中调用的正是:我猜你想要的是:
但是python中没有
pointer
。您可以将Recur
的代码合并到Insert
,或者如果您想同时维护Recur
和Insert
:当然还是
None
。你没有给它赋值。应该是。你知道吗但是,函数
因为
node
没有在任何地方使用,只分配给。你知道吗编辑:在更新代码之后,我们可以看到您正在尝试做什么。你的
test.root
之所以是None
,是因为你从不分配它。问题在于:从
self.insertRecur(self.root, data)
调用此函数时,它指向与self.root
相同的值,即None
。当您执行node = Node(data)
操作时,您正在重新指派node
以指向Note(data)
,这不会重新指派self.root
。请改为:您的示例将在某些编程语言中工作。(例如
C
允许通过指针引用实现这一点。)它在这里不起作用的原因是Python中如何定义方法调用的语义。你知道吗Python中的名称绑定
当你写作的时候
这将为对象
None
分配一个新名称(self.data
)。你知道吗其中
self.Recur
定义为下面在
Recur
方法的上下文中为None
提供了一个新名称:node
。你知道吗但是,同一对象的内部作用域中的这个新名称(
node
)与外部作用域中的另一个名称(self.data
)没有关联。你知道吗当你写作的时候
这会将名称
node
分配给一个新值,即 名称data
引用。同样,这不影响名称self.data
。有关更多信息,请查看此blog post。你知道吗如何做你想做的
另一方面,如果希望
Recur
能够将值赋给test
对象的任何属性,则可以这样做。在这里 是实现它的一种方法:NB:此代码未经测试
这允许
Insert
选择"data"
为其赋值的名称("data"
)。Recur
则使用Python的dict key get item语法为准dict对象中的键data
赋值;但是,我们将get item和set item语义设置为与get属性相同,并将属性语义设置为与最后两行相同-这确保了self["name"]
与self.name
的意思相同。一个不那么神秘的实现是:相关问题 更多 >
编程相关推荐