03-树2 List Leaves (25 分)(python)

博主通过题目发现并未充分利用树的结构,而是从叶子节点开始,根据左右孩子赋予0或1来构建列表,然后利用二进制计算找出优先输出的叶子节点。然而,这种方法的耗时和内存消耗相对较高,引发对于算法效率的疑问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写完看老师讲解才发现自己都没用到树的结构,且排错的时候才发现这题是考树的遍历的。(结果学了都没用上,所以应该会重写一遍吧OTZ)

思路:和上一题一样,从叶子找起,存储叶子位置i,同时利用加权的思想,因为从左向右,所以如果是左孩子就赋值0,右孩子就赋值1(实际操作的时候发现反过来更便利),最后得到一系列[i,0,1,0,1]的list,其中同等长度内,后几位用二进制计算,最小的就是应该优先输出的,输出i。

n=int(input())
L=[]
for i in range(n):
    a=list(input().split())
    L.append(a)


def findline(L):
    LC=[]
    for i in range(len(L)):
        l=[]
        if (L[i][0]=='-')&(L[i][1]=='-'):
            l=makeline(L,i)
            LC.append(l)
    return LC

def makeline(L,a):
    l=[]
    l.append(a)
    L.append([None,None,None])
    while True:
        for i in range(len(L)):
            if((L[i][0]==str(a))|(L[i][1]==str(a))):
                if(L[i][0]==str(a)):
                    l.append(0)
                else:
                    l.append(1)
                a=i
                break
        if L[i]==[None,None,None]:
            break
    return l

def order(L):
    a=10 #因为题目告诉我们最大N小于10
    L1=[]
    Lout=[]
    while(L!=[]):       
        for i in L:
            if(len(i)<a):
                a=len(i)       
        for i in L:
            if(len(i)==a):
                L1.append(i)
        for i in L1:
            L.remove(i)
        if len(L1)>1:
            minbit=511#二进制9个数最大值
            while (L1!=[]):
                mini=0
                for i in L1:
                    bit=0
                    for j in range(a-1):
                        bit=bit+i[j+1]*2**j
                        #print('j:',j,'bit:',bit)
                    if(bit<minbit):
                        minbit=bit
                        mini=i
                    
                Lout.append(mini[0])
                L1.remove(mini)
                minbit=511        
        else:
            Lout.append(L1[0][0])
        L1=[]
        a=10
        
    return Lout

def printl(L):
    for i in range(len(L)-1):
        print(L[i],end=" ")
    print(L[-1])
            
L2=findline(L)
L2=order(L2)
printl(L2)
测试结果
测试点提示结果耗时内存
0sample 编号乱序,有单边左孩子,中间层少先输出答案正确22 ms3188 KB
1最大N,有单边右孩子,多层答案正确18 ms3316 KB
2最小N答案正确18 ms3316 KB
3每层都有输出,有双孩子答案正确19 ms3316 KB
4单边树,只有1个输出答案正确18 ms3316 K

最后发现耗时和内存都比别人大,究竟是语言的问题,还是算法问题呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值