题意:
题意翻译
输入一个二叉树的中序和后序遍历,请你输出一个叶子节点,该叶子节点到根的数值总和最小,且这个叶子是编号最小的那个。 输入: 您的程序将从输入文件中读取两行(直到文件结尾)。第一行是树的中序遍历值序列,第二行是树的后序遍历值序列。所有值将不同,大于零且小于或等于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()