题目链接:https://www.nowcoder.com/practice/b31734e46ba644de85a9cf95bbd57a5f
思路:
根据前序遍历和中序遍历构造树,唯一的区别在于【根节点的取值】不再是root.val而是sum(pre[1:])除了根节点之外的所有节点和。
class Tree:
def __init__(self,x):
self.val = x
self.left = None
self.right = None
pre = list(map(int,input().split()))
tin = list(map(int,input().split()))
def build_tree(pre,tin):
if len(pre) == 0:
return None
i = tin.index(pre[0])
if len(pre) == 1:
root = Tree(0)
else:
root = Tree(sum(pre[1:]))
left_pre = pre[1:i+1]
left_tin = tin[:i]
right_pre = pre[i+1:]
right_tin = tin[i+1:]
root.left = build_tree(left_pre,left_tin)
root.right = build_tree(right_pre,right_tin)
return root
def midtree(root):
if not root:
return []
return midtree(root.left) + [root.val] + midtree(root.right)
root = build_tree(pre,tin)
res = midtree(root)
print(' '.join(list(map(str,res))))
简化版:
不需要重新构造树,直接求list
pre = list(map(int,input().split()))
tin = list(map(int,input().split()))
def tree_list(pre,tin):
if len(pre) == 0:
return []
if len(pre) == 1:
return [0]
i = tin.index(pre[0])
left_pre = pre[1:i+1]
left_tin = tin[:i]
right_pre = pre[i+1:]
right_tin = tin[i+1:]
root_left = tree_list(left_pre,left_tin)
root_right = tree_list(right_pre,right_tin)
return root_left + [sum(pre[1:])] + root_right
res = tree_list(pre,tin)
print(' '.join(list(map(str,res))))