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)方法吗?
答案 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)))