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

How to convert a binary tree in to a dictionary of levels

在python和任何其他语言中,很容易使用队列数据结构遍历(按级别顺序,因此 BFS)二叉树。给定 python 中的邻接列表表示和树的根,我可以按级别顺序遍历树并按顺序打印级别元素。尽管如此,我不能做的是从邻接列表表示到 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

它所做的只是将邻接列表放在树的正确级别顺序中,如果我打印循环的开始,它将按级别顺序遍历打印。尽管如此,它并没有解决我的问题。我知道邻接列表不是树的最佳表示,但我需要将它用于我正在执行的任务。

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

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。

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


Example/Demo -

>>> 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']}