如何将二叉树转换为级别字典
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']}
在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']}