Python中基于树的地图

时间:2014-04-19 21:28:31

标签: python map return-value binary-search-tree key-value

mapSearch是一个接受键和地图的函数,并返回与键相关的值,如果键不存在则返回None,然后返回None。

问题:当我运行搜索功能时,无论我为密钥输入什么内容,它都会保持返回相同的值。

class EmptyMap():
    __slots__ = ()


class NonEmptyMap():
    __slots__ = ('left', 'key', 'value', 'right')

EMPTY_MAP = EmptyMap()

def mkEmptyMap():
    return EMPTY_MAP

def mkNonEmptyMap(b1, key, value, b2):
    node = NonEmptyMap()
    node.left = b1;
    node.key = key;
    node.value = value;
    node.right = b2;
    return node;

def mapInsert(key, value, mp):

if isinstance(mp, EmptyMap):
    return mkNonEmptyMap(mkEmptyMap(), key, value, mkEmptyMap())

else:
    if key == mp.key:
        mp.value = value
    elif mp.key < key:
        mp.left = mapInsert(key, value, mp.left)
    else:
        mp.right = mapInsert(key, value, mp.right)

    return mp

def search(key, mp):
    if isinstance(mp, EmptyMap):
        return None
    elif isinstance(mp, NonEmptyMap):
        if key == mp.key:
            return mp.value
        elif mp.key < key:
            mp.left = search(key, mp.left)
            return mp.value
        else:
            mp.right = search(key, mp.right)
            return mp.value

2 个答案:

答案 0 :(得分:1)

我非常确定您遇到的问题只是因为您未获得mapInsert所期望的返回值。当前代码始终返回插入提供值的节点,即使它是树中某处的叶节点。 (实际上,并不是我仔细观察它有一些额外的错误,你正在递归并返回。)

我认为您应该更改return elsemapInsert中的mp语句,以返回mp.left,而不是递归调用的结果。调用的结果应分配到mp.rightdef mapInsert(key, value, mp): if isinstance(mp, EmptyMap): return mkNonEmptyMap(mkEmptyMap(), key, value, mkEmptyMap()) else: if key == mp.key: mp.value = value elif mp.key < key: mp.left = mapInsert(key, value, mp.left) # don't return recursive result else: mp.right = mapInsert(key, value, mp.right) # pass the right child here! return mp # always return mp from this branch ,具体取决于我们递归的那一方。

{{1}}

注意更多&#34; Pythonic&#34;设计可能会使用类中的方法,而不是单独的函数来处理这种事情。这需要对空树进行稍微不同的处理。

答案 1 :(得分:0)

一个明显的问题:

    if key == mp.key:
        mp.value = value
    elif mp.key > key:
        return mapInsert(key, value, mp.left)
    else:
        return mapInsert(key, value, mp.left)

其中一个根本没有返回任何东西,其他两个返回相同的东西。