作为一个整体,我对Python和递归函数是相当陌生的,所以请原谅我的无知。
我正在尝试用Python实现一个二进制搜索树,并有以下插入方法(从一个类中提取):
def insert(self, key, root=None):
'''Inserts a node in the tree'''
if root == None:
root = self.root
if root.key == None:
self._update(root, key)
return 0
else:
tmp = root
if key > tmp.key: # we work with the right subtree
self.insert(key, root=tmp.right)
elif key < tmp.key: # we work with the left subtree
self.insert(key, root=tmp.left)
else: # key already exists
return 0
我不确定这是否清晰,但它会遍历整个树,直到值为None,并用要插入的键更新节点。
现在,该方法可以很好地工作,并正确地从头开始创建BST。但是return语句有一个问题,因为如果没有执行递归,它只返回0。
>>> bst.insert(10)
0
>>> bst.insert(15)
>>> bst.root.right.key
15
>>>
“插入”根键再次返回0(来自第15行)。
>>> bst.insert(10)
0
我不明白为什么会这样。如果我在第6行放入一条print语句,它将正确执行,但它不会返回第一次插入之后的任何内容。为什么会这样呢?(我非常确定我遗漏了一些关于Python和递归的基本信息)
谢谢你的帮忙,
伊万
附言:我读到过递归不是实现BST的最佳方式,所以我将研究其他解决方案,但在继续之前,我想知道这个问题的答案。
发布于 2009-06-01 21:58:31
在递归行上,您不会返回任何内容。如果你想让它返回0,你应该用下面这样的代码行替换它们:
return self.insert(key, root=tmp.left)
而不是仅仅
self.insert(key, root=tmp.left)
发布于 2020-07-20 03:41:29
在您的递归用例中需要一个return语句。试试这个调整。
def insert(self, key, root=None):
'''Inserts a node in the tree'''
if root == None:
root = self.root
if root.key == None:
self._update(root, key)
return 0
else:
tmp = root
if key > tmp.key: # we work with the right subtree
return self.insert(key, root=tmp.right)
elif key < tmp.key: # we work with the left subtree
return self.insert(key, root=tmp.left)
else: # key already exists
return 0
https://stackoverflow.com/questions/937000
复制相似问题