uva548 由树的中、后序遍历建树 python

题意:

题意翻译
输入一个二叉树的中序和后序遍历,请你输出一个叶子节点,该叶子节点到根的数值总和最小,且这个叶子是编号最小的那个。 输入: 您的程序将从输入文件中读取两行(直到文件结尾)。第一行是树的中序遍历值序列,第二行是树的后序遍历值序列。所有值将不同,大于零且小于或等于10000.二叉树的节1<=N<=10000。 输出: 对于每个树描述,您应该输出最小值路径的叶节点的值。存在多路径最小的情况下,您应该选择终端叶子节点上具有最小值的那条路径,且输出那个最小值的终端叶子。

Translated by @凉凉

输入输出样例
输入 #1复制
3 2 1 4 5 7 6
3 1 2 5 6 7 4
7 8 11 3 5 16 12 18
8 3 11 7 16 18 12 5
255
255
输出 #1复制
1
3
255

python 代码



def build(num, l, r, l1, r2) :
    global tre
    global op1
    global op2
    if l == r :
        tre[num] = op1[l]
        return


    m = r - l + 1
    pos = op1.index(op2[r2])
    #print(pos)
    tre[num] = op1[pos]
    if pos-1>=l :
        #print(l,pos-1)
        build(num*2, l, pos-1, l, pos-1)
    if pos+1<=r :
        #print(pos+1,r)
        build(num*2 + 1, pos+1, r, pos, r-1)
    return


def dfs(num, sum) :
    global tmp
    global tre
    if tre[num*2]>10000 and tre[num*2+1]>10000 :
        if sum < tmp:
            global ans
            ans = tre[num]
            tmp = sum
            #print(ans)

        if sum == tmp:

            ans = min(ans, tre[num])

        return

    dfs(num*2, sum+tre[num*2])
    dfs(num*2 + 1, sum+tre[num*2+1])
    return


def main():
    global op1
    global op2
    op1 = list(range(10000 + 5))
    op2 = list(range(10000 + 5))
    while True :
        try:
            opp1 = []
            opp1 = list(map(int, input().split()))
            opp2 = list(map(int, input().split()))

            global tre
            global tmp
            global ans

            tre = list(range(10005))
            n = len(opp1)
            for i in range(1,max(len(opp1),1)+1):
                op1[i] = opp1[i-1]
                op2[i] = opp2[i-1]

            for i in range(10005):
                tre[i] = 10001
            build(1, 1, n, 1, n)
            ans = 10001
            tmp = 2147483646
            dfs(1,tre[1])
            print(ans)

        except EOFError:
            break

if __name__ == '__main__':
    main()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值