写完看老师讲解才发现自己都没用到树的结构,且排错的时候才发现这题是考树的遍历的。(结果学了都没用上,所以应该会重写一遍吧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)
测试点 | 提示 | 结果 | 耗时 | 内存 |
---|---|---|---|---|
0 | sample 编号乱序,有单边左孩子,中间层少先输出 | 答案正确 | 22 ms | 3188 KB |
1 | 最大N,有单边右孩子,多层 | 答案正确 | 18 ms | 3316 KB |
2 | 最小N | 答案正确 | 18 ms | 3316 KB |
3 | 每层都有输出,有双孩子 | 答案正确 | 19 ms | 3316 KB |
4 | 单边树,只有1个输出 | 答案正确 | 18 ms | 3316 K |
最后发现耗时和内存都比别人大,究竟是语言的问题,还是算法问题呢?