在Python中搜索二进制搜索树的两面

时间:2012-04-10 23:56:26

标签: python binary-search-tree

我在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) 

不幸的是,我只会搜索树的左侧,而不是右侧,如果我首先搜索右侧则相反。

我如何搜索双方?

5 个答案:

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

它还可以处理多个匹配。