【问题标题】:How to convert a binary tree in to a dictionary of levels如何将二叉树转换为级别字典
【发布时间】:2015-08-24 14:25:44
【问题描述】:

在 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

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

【问题讨论】:

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


    【解决方案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。

    在每个级别中,它获取该级别元素的子元素并创建一个新列表,同时创建级别字典(在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']}
    

    【讨论】:

      猜你喜欢
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 2019-09-04
      • 2021-06-07
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多