您需要返回递归调用的结果。你忽略了它:if(node.l != None):
self.return_key(val, node.l)
以及
^{pr2}$
递归调用与其他函数调用没有区别,如果有返回值,则仍需要处理返回值。使用return语句:if(node.l != None):
return self.return_key(val, node.l)
# ...
if(node.r != None):
return self.return_key(val, node.r)
请注意,由于None是一个单例值,您可以而且应该在这里使用is not None来测试是否存在:if node.l is not None:
return self.return_key(val, node.l)
# ...
if node.r is not None:
return self.return_key(val, node.r)
我怀疑您将错误的参数传递给要开始的调用;但是,如果第二个参数是节点,请不要传入节点值:print(tree.return_key(6, tree.getRoot())) # drop the .v
另外,如果所有的node类都有相同的方法,则可以递归到该方法,而不是在Tree上使用self.return_value();只需执行以下操作:print tree.return_key(6)
{cd7>委托给根节点^:def return_key(self, val):
root = tree.getRoot()
if root is not None:
return tree.getRoot().return_key(val)
并且Node.return_key()变成:def return_key(self, val):
if val < self.v:
if self.l is not None:
return self.l.return_key(val)
elif val > self.v:
if self.r is not None:
return self.r.return_key(val)
# val == self.v or child node is None
return self
我在这里也更新了val测试逻辑;如果val < self.v(或代码中的val < node.v)为false,不要假设val > self.v为真;val可以相等。在