我正在查看教程“使用算法和数据结构解决问题”(http://interactivepython.org/runestone/static/pythonds/Trees/SearchTreeImplementation.html)中的“二叉搜索树”部分。在某些情况下,他们使用名称相同的“公共”和“私人”帮助程序方法,例如对于“放置”方法:
def put(self,key,val):
if self.root:
self._put(key,val,self.root)
else:
self.root = TreeNode(key,val)
self.size = self.size + 1
def _put(self,key,val,currentNode):
if key < currentNode.key:
if currentNode.hasLeftChild():
self._put(key,val,currentNode.leftChild)
else:
currentNode.leftChild = TreeNode(key,val,parent=currentNode)
else:
if currentNode.hasRightChild():
self._put(key,val,currentNode.rightChild)
else:
currentNode.rightChild = TreeNode(key,val,parent=currentNode)
我在其他地方也看到过这种方法,但是我并不真正理解这种动机。与将所有内容直接放入一种方法相比,它的优点是什么,仅仅是为了提高可读性?
答案 0 :(得分:1)
基本原理是该类的用户对“当前节点”一无所知。当前节点仅在递归插入过程中才有意义,它不是树的永久属性。用户将树视为一个整体,仅对其进行插入/查找操作。
也就是说,您可以通过使用默认值currentNode=None
并进行检查,将两种方法混合在一起。但是,这两种方法做的事情截然不同。 put
方法仅初始化根,而_put
执行递归插入,因此最好将它们分开。
答案 1 :(得分:1)
这里,动机是使用递归。您可能已经注意到,_put
方法本身和方法签名是不同的。如果将_put
方法放入公共方法,则必须更改公共方法的签名才能处理给定节点上的放置操作。只需添加currentNode
参数。但是,原始的公共方法没有此参数。我想是因为作者不想向最终用户公开此功能。