我在python中有一个BST,每个节点包含3个数据。这些数据是ID,Mark和Name。
我尝试做的是搜索名称,但节点基于ID,这就是我搜索的方式。该函数应该输出特定名称的ID。
def findName(tree,name):
if tree==None:
return None
elif tree['name']==name:
return tree['id']
if tree['left']!=None:
return findName(tree['left'],name)
if tree['right']!=None:
return findName(tree['right'],name)
不幸的是,我只会搜索树的左侧,而不是右侧,如果我首先搜索右侧则相反。
我如何搜索双方?
答案 0 :(得分:4)
如果你还没完成,你不应该return
!相反,您可以使用单个短路or
替换最后4行:
return findName(tree['left'], name) or findName(tree['right'], name)
请确保您的ID不包含0
,否则此方法将失败,因为0
是一个假值,就像无。
答案 1 :(得分:2)
...
result = findName(tree['left'],name)
if result is None:
result = findName(tree['right'],name)
return result
答案 2 :(得分:0)
问题是你回来了
if tree['left']!=None:
return findName(tree['left'],name)
你需要做的是创建一个局部变量并将其设置为findName()
的值,然后如果你得到None继续右边,否则返回值。
答案 3 :(得分:0)
如果您希望避免额外的递归调用,可以像这样遍历分支。请注意,最好测试None
的身份而不是相等
for branch in ('left', 'right'):
if tree[branch] is not None:
result = findName(tree[branch], name)
if result is not None:
return result
答案 4 :(得分:0)
试试这个:
def search(node, name):
self_result = [node['id']] if node['name'] == name else []
if not node['left'] and not node['right']:
return self_result
elif node['left'] and not node['right']:
return self_result + search(node['left'], name)
elif not node['left'] and node['right']:
return self_result + search(node['right'], name)
else:
return self_result + search(node['left'], name) + search(node['right'], name)
test_tree = {'id':0, 'name': 'a',
'left': {'id':1, 'name': 'a',
'left':{'id':3, 'name':'c',
'left':{'id':4,'name': 'd',
'left' : None,
'right' : None},
'right':None},
'right':{'id':4, 'name':'e',
'left': None,
'right': None}
},
'right': {'id':5, 'name':'c',
'left': {'id':6, 'name':'e',
'left': None,
'right': None},
'right': {'id': 7, 'name': 'a',
'left' : {'id' : 8, 'name': 'b',
'left': None,
'right' : None},
'right' : None
}
}
}
if __name__ == '__main__':
assert search(test_tree, 'a') == [0, 1, 7]
assert search(test_tree, 'b') == [8]
assert search(test_tree, 'c') == [3, 5]
assert search(test_tree, 'e') == [4, 6]
print 'ok'
它还可以处理多个匹配。