在树中查找节点

时间:2013-08-04 20:08:13

标签: python recursion tree

我在使用任意分支因子在树中查找节点时遇到问题。每个节点都携带数据,并且有零个或多个子节点。搜索方法在Node类中 检查该节点是否携带数据,然后检查所有节点子节点。在我的递归方法中,我总是以无限循环结束,任何帮助?

def find(self, x):

    _level = [self]
    _nextlevel = []

    if _level == []: 
        return None
    else:
        for node in _level:
            if node.data is x:
                return node
            _nextlevel += node.children
        _level = _nextlevel
    return self.find(x) + _level

find方法在Node类中,检查数据x是否在调用方法的节点中,然后检查所有节点的子节点。我不断得到一个无限循环,真的坚持到这一点,任何见解都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

此代码存在一些问题。首先,请注意第2行您有_level = [self]。这意味着第5行的if _level == []将始终为false。

第二个问题是,for循环会覆盖_level中的所有内容,但如上所述,由于第2行,该循环始终为[self]

第三个问题是return语句。你有return self.find(x) + _level。这将分为两部分进行评估。首先,调用self.find(x),然后将返回的内容与_level的内容连接起来。但是,当你调用self.find(x)时,它将使用相同的参数调用相同的方法,然后依次命中相同的return self.find(x) + _level行,这将再次调用相同的方法,然后依次调用永远。

答案 1 :(得分:1)

递归搜索的简单模式是使用生成器。这使得调用代码的答案很容易,而无需自己管理递归状态。

class Example(object):
     def __init__(self, datum,  *children):
         self.Children = list(children) # < assumed to be of the same or duck-similar class
         self.Datum = datum

     def GetChildren(self):
         for item in self.Children: 
             for subitem in item.GetChildren():
                 yield subitem
             yield item

     def FindInChildren(self, query):  # where query is an expression that is true for desired data
         for item in self.GetChildren():
             if query(item):
                yield item