在Python中查找并返回树中的节点

时间:2014-11-22 22:13:03

标签: python recursion tree find nodes

class WNode(object):
    def __init__(self,w):
        self._w=w
        self._content=[]
    def find(self, x):
        if self._w is x:
            return self
        else:
            for i in self._content:
                return i.find(x)
        return None

您好。我遇到了创建方法tree.find(self,x)的麻烦,如果x存在,则返回树中名为x的节点(使用递归)。我写的那个似乎只在某些情况下工作(在几个层次的简单树中),但在其他情况下(特别是在较大的树中),即使存在节点,它也会返回None。有人知道如何创建一个返回x节点的工作查找(self,x)方法吗?

2 个答案:

答案 0 :(得分:0)

那是因为你的find函数只查找最左边分支中的节点。想一下如下树的例子:

      A
    /   \
   B     C
  / \
 D   E

鉴于您正在寻找节点C.您的find函数首先查看分支B,然后检查D. D没有子节点,因此它结束for循环并返回None 。它不会搜索其他分支,因为已经返回了一些东西。

实际上,如果你想在树中找到一个节点,你应该实现BFS或DFS算法来遍历你的树。由于您的find函数是DFS,我将为您编写DFS代码:

def find(self,x):
  s_list = []
  if self._w is x:
    return self
  else:
    s_list.extend(self._content)
    while s_list:
      node = s_list.pop()
      if node._w is x:
        return node
      else:
        s_list.extend(node._content)
  return None

s_list用作搜索路径,记录每个节点find应检查的内容。如果已检查所有节点,则返回None

答案 1 :(得分:0)

另一种答案。与您和Todd Tao的解决方案类似,它实现了DFS。但是,一旦完成探索分支失败,它将继续下一个分支。你的代码只搜索最左边的分支。

class WNode(object):

    def __init__(self,w):
        self._w=w
        self._content=[]

    def find(self, x):
        if self._w == x:
            return self
        else:
            y = None
            for i in self._content:
                y = i.find(x)
                if y:
                    break
            return y
        return None

if __name__ == '__main__':
    r = WNode(1)
    r._content = [WNode(2), WNode(3), WNode(4)]
    for i in xrange(1, 6):
        print('find({}) = {}'.format(i, r.find(i)))