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
和test.root是None
答案 0 :(得分:2)
当然它仍然是None
。你没有给它赋值。应该是。
def Insert(self, data):
self.data = data
self.Recur(self.data, data)
然而,功能
def Recur(self, node, data):
if node is None:
node = data
绝对没有(并且从未做过),因为node
未在任何地方使用,仅被分配到。
编辑:在您更新了代码后,我们可以看到您尝试做的事情。您test.root
None
的原因是因为您从未分配它。问题出在这里:
def insertRecur(self, node, data):
if node is None:
node = Node(data)
从self.insertRecur(self.root, data)
调用此函数时,它指向与self.root
None
相同的值。node = Node(data)
。执行node
后,您要重新分配Note(data)
以指向self.root
,这不会重新分配class Node:
"""A Tree Node with 3 attributes: l_child, r_child and data"""
def __init__(self):
self.data = None
self.l_child = None
self.r_child = None
class BST(object):
"""Implement a Binary Search Tree class"""
def __init__(self):
self.root = Node()
print "Initial root", self.root
def insertRecur(self, node, data):
if node.data is None:
node.data = data
elif data < node.data:
node.l_child = node.l_child or Node()
self.insertRecur(node.l_child, data)
else:
node.r_child = node.r_child or Node()
self.insertRecur(node.r_child, data)
def Insert(self, data):
self.insertRecur(self.root, data)
。这样做:
web = (WebView)findViewById(R.id.web_vieww);
web.loadUrl("http://www.google.co.in/");
web.setWebViewClient(new MyWebViewClient());
Define MyWebViewClient();
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
}
答案 1 :(得分:0)
您只需将self.data
的值分配给node
,而不是variable self.data
本身。你在Insert
函数中调用的是:
self.Recur(None, 5)
我想你想要的是:
self.Recur(*self.data, 5)
但是python中没有pointer
。您可以将Recur
的代码合并到Insert
,或者如果您想同时维护Recur
和Insert
:
def Recur(self, node, data):
if node is None:
node = data
return node
def Insert(self, data):
self.data = self.Recur(self.data, data)
答案 2 :(得分:0)
您的示例将在某些编程语言中工作。 (例如
C
允许这个,通过指针引用。)它在这里不起作用的原因是因为在Python中定义了方法调用的语义。
写作时
self.data = None
这会为对象self.data
指定一个新名称(None
)。
将self.Recur
定义为
def Recur(self, node, data):
if node is None:
node = data
以下在None
方法的上下文中为Recur
提供了一个新名称:
node
。
self.Recur(self.data, data)
但是,同一对象的内部作用域中的这个新名称(node
)与外部作用域中的另一个名称(self.data
)没有相关性。
写作时
node = data
这会将名称node
分配给一个新值,即值
名称data
指的是。同样,这不会影响名称
self.data
。有关详细信息,请查看此blog post。
另一方面,如果您希望Recur
能够为test
对象的任何属性赋值,则可以完成。这里
是实现它的一种方式:
class test:
def __init__(self):
self.data = None
def Recur(self, nodeName, data):
if self[nodeName] is None:
self[nodeName] = data;
def Insert(self, data):
self.Recur("data", data)
__getitem__ = self.__getattr__
__setitem__ = self.__setattr__
注意:此代码未经测试
这允许Insert
选择"data"
分配值的名称(Recur
)。 Recur
就其本身而言,使用Python的dict-key get-item语法为我们的准dict对象中的键data
赋值;但是,我们将get-item和set-item语义设置为与最后两行的get-attribute和set-attribute语义相同 - 这确保self["name"]
与self.name
的含义相同}。一个不太神秘的实现将是:
def __getitem__(self, key):
return self.__getattr__(key)