如何将二叉树转换为级别字典

时间:2015-08-24 14:25:44

标签: python tree binary-tree breadth-first-search adjacency-list

在python和任何其他语言中,使用队列数据结构遍历(按照级别顺序,如此BFS)二叉树是非常容易的。给定python中的adjecency list表示和树的根,我可以按级别顺序遍历树并按顺序打印级别元素。尽管如此,我不能做的是从一个adjecency list表示到level_dictionary或类似的东西:

所以我想从

开始

adjecency_list = {'A': {'B','C'}, 'C':{'D'}, 'B': {'E'}}

levels = {0: ['A'], 1: ['B','C'], 2: ['D','E']}

到目前为止,我有以下内容:

q = Queue()
o = OrderedDict()
root = find_root(adjencency_list) # Seperate function it works fine
height = find_height(root, adjencency_list) # Again works fine
q.put(root)

# Creating a level ordered adjecency list
# using a queue to keep track of pointers
while(not q.empty()):
    current = q.get()
    try:
        if(current in adjencency_list):
            q.put(list(adjencency_list[current])[0])
            # Creating ad_list in level order
            if current in o:
                o[current].append(list(adjencency_list[current])[0])
            else:
                o[current] = [list(adjencency_list[current])[0]]
        if(current in adjencency_list):
            q.put(list(adjencency_list[current])[1])
            # Creating ad_list in level order
            if current in o:
                o[current].append(list(adjencency_list[current])[1])
            else:
                o[current] = [list(adjencency_list[current])[1]]
    except IndexError:
        pass

所有这一切都是将对象列表放在树的正确级别顺序中,如果我打印了循环的开头,它将以级别顺序遍历打印。尽管如此,它并没有解决我的问题。我知道adjecency list不是树的最佳表示,但我需要将它用于我正在进行的任务。

1 个答案:

答案 0 :(得分:1)

从邻接列表创建级别字典的递归方法是 -

def level_dict(adj_list,curr_elems,order=0):
    if not curr_elems:    # This check ensures that for empty `curr_elems` list we return empty dictionary
            return {}   
    d = {}
    new_elems = []
    for elem in curr_elems:
            d.setdefault(order,[]).append(elem)
            new_elems.extend(adj_list.get(elem,[]))
    d.update(level_dict(adj_list,new_elems,order+1))
    return d

方法的起始输入将是列表中的根元素,例如 - ['A'],以及初始级别,即0。

在每个级别中,它获取该级别元素的chlidren并创建一个新列表,同时创建级别字典(在d中)。

示例/演示 -

>>> adjecency_list = {'A': {'B','C'}, 'C':{'D'}, 'B': {'E'}}
>>> def level_dict(adj_list,curr_elems,order=0):
...     if not curr_elems:
...             return {}
...     d = {}
...     new_elems = []
...     for elem in curr_elems:
...             d.setdefault(order,[]).append(elem)
...             new_elems.extend(adj_list.get(elem,[]))
...     d.update(level_dict(adj_list,new_elems,order+1))
...     return d
...
>>> level_dict(adjecency_list,['A'])
{0: ['A'], 1: ['C', 'B'], 2: ['D', 'E']}