<p>这里有一个使用访问者设计模式的建议</p>
<p>在这种模式中,您正在编写一个visitor方法,而不知道访问的每个节点需要做什么</p>
<p>我们将更改基类以添加访问者功能</p>
<pre><code>class BinarySearchTree(object):
# snipped
def _insert(self, key, val, visitor=None): # Change here
prevNode = None
currentNode = self.root
while currentNode:
prevNode = currentNode
if visitor: visitor(prevNode) # Change here
if key < currentNode.key:
currentNode = currentNode.leftChild
else:
currentNode = currentNode.rightChild
if key < prevNode.key:
prevNode.leftChild = self.Node(key, val, parent=prevNode)
self.updateNodeProperties(prevNode.leftChild)
else:
prevNode.rightChild = self.Node(key, val, parent=prevNode)
self.updateNodeProperties(prevNode.rightChild)
# snipped
</code></pre>
<p>现在是你的第二节课</p>
<pre><code>class RBTree(BinarySearchTree):
# snipped
def _insert(self, key, val):
visitor = lambda node: node.size += 1
super(RBTree, self)._insert(self, key, val, visitor)
# snipped
</code></pre>