如何找到函数中调用的访问节点?

时间:2017-12-12 13:09:00

标签: python binary-search-tree

这是我的二进制搜索树程序,所有功能都在上传系统,除了最后一个,我不得不找出我在调用以前的功能时访问了哪些节点。有什么想法吗?

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

它必须返回列表中节点的值。

2 个答案:

答案 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

minmax相同,最后:

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标志。