PAT A1064 python

仅做混满分之用,可读性差,书写不规范,我自己也看不懂了。。。

sta=int(input())
nl=list(int(x)for x in input().split())
nl=sorted(nl)
i=1
while True:
    if 2**i-1>=sta:
        break
    else:
        i+=1

class tn:
    def __init__(self,num):
        self.num=num
        self.left=[]
        self.right=[]
def create(nl,floor):
    if floor==1:
        return tn(nl[0])
    else:
        summ=len(nl)
        pre=2**(floor-1)-1
        lastline=summ-pre
        if lastline<=2**(floor-2):
            left=(pre-1)//2+lastline
        else:
            left=(pre-1)//2+2**(floor-2)
        leftlist=nl[0:left]
        rightlist=nl[left+1:len(nl)]
        prenode=tn(nl[left])
        prenode.left=create(leftlist,floor-1)
        if rightlist:
            if summ-left-1>2**(floor-2)-1:
                prenode.right=create(rightlist,floor-1)
            else:
                prenode.right = create(rightlist, floor - 2)
        return prenode
gettree=create(nl,i)

stand=[gettree]
outlist=[]
while stand:
    pre=stand[0]
    del stand[0]
    if pre.left:
        stand.append(pre.left)
    if pre.right:
        stand.append(pre.right)
    outlist.append(pre.num)
out=list(str(x) for x in outlist)
print(' '.join(out))


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值