我对Python和整个递归函数还很陌生,所以请原谅我的无知。
我正在尝试在Python中实现二进制搜索树,并具有以下insert方法(从类中取出):
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 >>>
再次“插入”根密钥,其方式应从第15行返回0。
>>> bst.insert(10) 0
我不知道为什么会这样。如果我在第6行放置一条print语句,它可以正确执行,但是第一次插入后将不会返回任何内容。为什么是这样?(我很确定我缺少有关Python和递归的一些基本信息)
谢谢你的帮助,
伊万
PS:我已经读到递归不是实现BST的最佳方法,因此我将研究其他解决方案,但是在继续之前,我想知道答案。
在递归行上,您什么也不返回。如果希望它返回0,则应将它们替换为以下行:
return self.insert(key, root=tmp.left)
而不只是
self.insert(key, root=tmp.left)