这是我的二进制搜索树程序,所有功能都在上传系统,除了最后一个,我不得不找出我在调用以前的功能时访问了哪些节点。有什么想法吗?
class Node:
def __init__(self, value):
self.left = None
self.right = None
self.data = value
class BinarySearchTree:
def __init__(self):
self.root = None
def insert(self, value):
if self.root is None:
self.root = Node(value)
else:
self._insert(value, self.root)
def _insert(self, value, curNode):
if value < curNode.data:
if curNode.left is None:
curNode.left = Node(value)
else:
self._insert(value, curNode.left)
else:
if curNode.right is None:
curNode.right = Node(value)
else:
self._insert(value, curNode.right)
def fromArray(self, array):
for i in range(len(array)-1):
value = array[i]
self.insert(value)
i += 1
def search(self, value):
if self.root is not None:
return self._search(value, self.root)
else:
return False
def _search(self, value, curNode):
if value == curNode.data:
return True
elif value < curNode.data and curNode.left is not None:
self._search(value, curNode.left)
elif value > curNode.data and curNode.right is not None:
self._search(value, curNode.right)
else:
return False
def min(self):
curNode = self.root
while curNode.left is not None:
curNode = curNode.left
return curNode
def max(self):
curNode = self.root
while curNode.right is not None:
curNode = curNode.right
return curNode
def visitedNodes(self):
pass
它必须返回列表中节点的值。
答案 0 :(得分:0)
如果您不想修改当前代码,也许这可以帮助您:
class Node:
def __init__(self, value):
self.left = None
self.right = None
self._data = value
self.visited = False
@property
def data(self):
self.visited = True
return self._data
@data.setter
def data(self, value):
self.visited = False
self._data = value
n = Node(3)
print(n.visited)
print(n.data)
print(n.visited)
输出:
False
3
True
然后在你的visitedNodes
方法中,你必须查看每个节点的被访问属性。 (这将很慢)
其他方法是在BinarySearchTree中添加新的set
属性,并在每次查看时手动add
一个节点,这样您就可以修改代码。
答案 1 :(得分:0)
直接的答案是为每个节点添加visited
标记,当访问Node
时,会在每个功能中明确翻转:
class Node:
def __init__(self, value):
self.left = None
self.right = None
self.data = value
self.visited = False
然后:
def _search(self, value, curNode):
curNode.visited = True
if value == curNode.data:
return True
# etc., unchanged
min
和max
相同,最后:
def visitedNodes(self, current=self.root, accumulator=[]):
if current == None:
return
if current == self.root:
accumulator = []
if current.visited:
accumulator.append(current)
visitedNodes(current.left)
visitedNodes(current.right)
return accumulator
这只是一个实现,还有很多其他方法可以做到这一点。我还假设这个函数遍历整个树,应该不设置visited
标志。