什么是求和树:二叉树的求和树, 是一颗同样结构的二叉树,其树中的每个节点将包含原始树中的左子树和右子树的和。
二叉树:
求和树:
二叉树给出前序和中序输入,求和树要求中序输出;
所有处理数据不会大于int;
数据范围:二叉树的节点数满足
,节点上的值满足 
2行整数,第1行表示二叉树的前序遍历,第2行表示二叉树的中序遍历,以空格分割
1行整数,表示求和树的中序遍历,以空格分割
10 -2 8 -4 6 7 5 8 -2 -4 10 7 6 5
0 4 0 20 0 12 0
import sys
def p(pre,mid):
if len(pre) <= 3:
print(0,sum(pre[1:]),0,end=' ')
return
rv = pre.pop(0)
#因为是满二叉树,所以符合条件的位置一定在[3,len(mid)]里面
index = mid[3:].index(rv) + 3
p(pre[:index],mid[:index])
print(sum(pre),end=' ')
p(pre[index:],mid[index+1:])
pre = list(map(int,input().split(' ')))
mid = list(map(int,input().split(' ')))
p(pre,mid) class TreeNode:
def __init__(self,val):
self.val = val
self.left = None
self.right = None
class Solution:
def createTree(self,preOrder,midOrder):
if len(preOrder) ==0 :
return None
root_index = midOrder.index(preOrder[0])
if len(preOrder) == 1:
root = TreeNode(0)
else:
root = TreeNode(sum(preOrder[1:]))
left_pre = preOrder[1:root_index+1]
right_pre = preOrder[root_index+1:]
left_mid = midOrder[0:root_index]
right_mid = midOrder[root_index+1:]
root.left = self.createTree(left_pre,left_mid)
root.right = self.createTree(right_pre,right_mid)
return root
def midTreverse(self,root):
if root == None:
return []
return self.midTreverse(root.left) + [root.val] + self.midTreverse(root.right)
s = Solution()
preOrder = [int(x) for x in input().split()]
midOrder = [int(x) for x in input().split()]
root = s.createTree(preOrder,midOrder)
print(" ".join(list(map(str,s.midTreverse(root))))) l1 = list(map(int,input().split()))
l2 = list(map(int,input().split()))
n = len(l1)
l3 = [False] * n
l4 = [0] * n
for i in l1:
index = l2.index(i)
l,r = index - 1,index + 1
l3[index] = True
while l >= 0 and l3[l] == False:
l4[index] += l2[l]
l -= 1
while r < n and l3[r] == False:
l4[index] += l2[r]
r += 1
print(' '.join(map(str,l4))) """
本题有如下规律:
求和树的根节点 = 除本身外原二叉树所有子节点之和,
本题中根节点为中序遍历数组中正中间项(满二叉树)
递归求得左右子树,直到子树节点个数为1返回[0]。
需要考虑根节点在两侧的情况,树节点个数为0时,返回空[]
"""
def func(d):
if len(d) == 1: return [0]
elif len(d) == 0: return []
mid = len(d) // 2 # 满二叉树根节点即正中间数值,前序遍历数组本题中用不到,可删除
return func(d[:mid]) + [sum(d[:]) - d[mid]] + func(d[mid + 1:])
if __name__ == "__main__":
a = list(map(int, input().strip().split()))
d = list(map(int, input().strip().split()))
ans = func(d)
print(' '.join(map(str, ans)))
"""
本题有如下规律:
求和树的根节点 = 除本身外所有子节点之和,
递归求得左右子树,直到子树节点个数为1返回[0]。
需要考虑根节点在两侧的情况,树节点个数为0时,返回空[]
"""
import sys
def func(a, d):
if len(a) == 1:
return [0]
elif len(a) == 0:
return []
mid = d.index(a[0])
d[mid] = sum(d[:]) - d[mid]
return func(a[1:(mid + 1)], d[:mid]) + \
[sum(d[:]) - d[mid]] + \
func(a[(mid + 1):], d[mid + 1:])
if __name__ == "__main__":
# sys.stdin = open('input.txt', 'r')
a = list(map(int, input().strip().split()))
d = list(map(int, input().strip().split()))
ans = func(a, d)
print(' '.join(map(str, ans)))