最小高度树(python)

最一道题还算是一个经典的dfs算法题,我希望通过这一道题,能够帮助我们一些初学者,更好的帮助
请添加图片描述
请添加图片描述

创栈和字典

将输入的信息进行转换为一个字典类型,通过python自带的collections.defaultdict 进行整理,并且同过栈将value 为1的放进栈中。

adjs=collections.defaultdict(list)
for x in edges: # 图的邻接表表示法,基本是模板
    adjs[x[0]].append(x[1]) # 1:{2}
    adjs[x[1]].append(x[0]) # 2:{1}
queue = deque() # 固定写法
    for key, value in adjs.items():
        if len(value) == 1:
            queue.append(key)

进行bfs算法

在bfs算法将其叶子节点给删去,和有叶子节点的字典中value删去

 while(queue): # 固定写法
 	size = len(queue)  # 固定写法
	n = n - size
	for _ in range(size):
		v = queue.popleft()
		v_adj = adjs[v].pop() # v的邻接仅一个,弹出即删除
        adjs[v_adj].remove(v) # 在v的邻接元素的邻接列表里删除v
        if len(adjs[v_adj]) == 1:
        	queue.append(v_adj)
记得考虑情况,当n=1,时只有一个数,就是本身,n=2时两个数都可以当根节点,下面是全部的代码
import collections
n=int(input())
edges=[[1,0],[1,2],[1,3]]   #这个是自己随便输入的
if n == 2:
    print([0,1])
if n == 1:
    print([0])
adjs = collections.defaultdict(list) # defaultdict写法很有用
for x in edges: # 图的邻接表表示法,基本是模板
    adjs[x[0]].append(x[1]) # 1:{2}
    adjs[x[1]].append(x[0]) # 2:{1}
# BFS队列: 初始队列放入初始元素,size=1的为叶子,入队
queue = collections.deque() # 固定写法
for key, value in adjs.items():
    if len(value) == 1:
        queue.append(key)
# BFS两个大循环
while(queue): # 固定写法
    size = len(queue)  # 固定写法
    n = n - size
    for _ in range(size):
        v = queue.popleft()
        v_adj = adjs[v].pop() # v的邻接仅一个,弹出即删除
        adjs[v_adj].remove(v) # 在v的邻接元素的邻接列表里删除v
        if len(adjs[v_adj]) == 1:
            queue.append(v_adj)
    if n == 1:
        print( [queue.popleft()])
    if n == 2:
        print([queue.popleft(), queue.popleft()])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值